鱼C论坛

 找回密码
 立即注册
查看: 2572|回复: 9

python函数中的列表值问题

[复制链接]
发表于 2016-12-22 19:55:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. def dex2bin(n,list1=[]):
  2.     if n//2 :
  3.         dex2bin(n//2)
  4.         list1.append(n%2)
  5.     else:
  6.         list1.append(n%2)
  7.     return list1
复制代码


代码是10进制转2进制,并将结果存储在list1中,实现的方法不好,但这不是重点重点是我发现调用一次是正确的,但是连续调用第二次、第三次时就不对了,好像是list1没有清空的原因?必须重新加载函数。。。

但是下一次调用函数 list1不是应该被默认值设为[ ]了吗?????为什么还会有问题?

请问各位大大~~这种情况要怎么处理,,我是python2.7 因此没有nonlocal.....
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-12-22 21:59:05 | 显示全部楼层
自定义函数变量有两个,貌似在递归函数中,第二个变量一直是缺省的……
既然都缺省了,还哪有重新赋值list1=[]的动作哦……
  1. def dec2bin(dec):
  2.     result = ''   
  3.     if dec:
  4.         result = dec2bin(dec//2)
  5.         return result + str(dec%2)
  6.     else:
  7.         return result
复制代码

我用字符串做的……感觉长的好看点?……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-22 22:04:45 | 显示全部楼层
sd小舅子 发表于 2016-12-22 21:59
自定义函数变量有两个,貌似在递归函数中,第二个变量一直是缺省的……
既然都缺省了,还哪有重新赋值list ...

但是我定义函数时候list1=[] (这不是设定默认值为[]?)
就是说我如果调用函数的时候不设定参数list1 他不是会用默认值么??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-22 22:29:13 | 显示全部楼层
supercyt 发表于 2016-12-22 22:04
但是我定义函数时候list1=[] (这不是设定默认值为[]?)
就是说我如果调用函数的时候不设定参 ...

第一次运行的时候,list1=[]是默认值……
但也仅仅是默认值,而不是重新赋值……
但如果在运行完整个函数之后没有复位的动作,list1里的数是不会变的吧……
我也是初学者……
猜的……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-22 22:35:03 | 显示全部楼层
sd小舅子 发表于 2016-12-22 22:29
第一次运行的时候,list1=[]是默认值……
但也仅仅是默认值,而不是重新赋值……
但如果在运行完整个函 ...


视频有个函数
  1. def ddin(x,y=3):
  2.           return x*y
复制代码

然后这个二次调用就是重新赋值。。。为何。。?
即使第一次对y设定值,下一次依然可以调用y的默认值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-22 22:36:42 | 显示全部楼层
supercyt 发表于 2016-12-22 22:35
视频有个函数

然后这个二次调用就是重新赋值。。。为何。。?

这里y的值自始至终就没变过啊……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-22 22:46:06 | 显示全部楼层
sd小舅子 发表于 2016-12-22 22:36
这里y的值自始至终就没变过啊……

http://www.myexception.cn/perl-python/1985576.html
跟你说的差不多 这里说了官方用法 哈哈 分享下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-22 23:00:56 | 显示全部楼层
supercyt 发表于 2016-12-22 22:46
http://www.myexception.cn/perl-python/1985576.html
跟你说的差不多 这里说了官方用法 哈哈 分享下

刚试了几种数字的递归,在声明变量的时候赋值确实不会变……
感谢分享……
感觉试list有问题,但没找到有力的根据……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-22 23:48:14 From FishC Mobile | 显示全部楼层
小甲鱼老师用的是python3+版本的吧,很奇怪你是怎么学的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-23 00:53:51 | 显示全部楼层
楼主你的函数在定义参数的时候,默认参数list1的值就被计算出来了,即[ ],因为默认参数list1也是一个变量,Ta指向对象[ ],每次调用该函数,如果改变了list1的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[ ]了。
所以,定义默认参数要牢记一点:默认参数必须指向不变对象!
我们可以用 None 这个不变对象来实现:
  1. def dex2bin(n,list1=None):
  2.         if list1 is None:
  3.             list1 = []
  4.         if n:
  5.             dex2bin(n//2)
  6.             list1.append(n%2)
  7.         else:
  8.             return list1
  9.         print(list1)
  10.    
复制代码

不知道这是不是你想要的结果???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-24 15:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表