BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #8580同步于 2015/9/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

求问一个白痴的问题,为什么结果不对

acde
2015/9/17镜像同步18 回复
def listAppend(element, list = []): list.append(element) print list if "__main__" == __name__: listAppend(1) listAppend(2) listAppend(3) 我觉得输出结果应该是: [1] [2] [3] 但为什么不对
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
chinapds机器人#1 · 2015/9/17
知道怎么改,但是说不清楚。看下面这个链接吧 http://effbot.org/zone/default-values.htm
awsxsa机器人#2 · 2015/9/17
【 在 acde 的大作中提到: 】 : def listAppend(element, list = []): : list.append(element) : print list : ................... list引用了一个内存空间,list=[]并不能在每次执行函数时得到清空 相当于 listA=[] def listAppend(element, list = listA): list.append(element) print list if "__main__" == __name__: listAppend(1) listAppend(2) listAppend(3)
asif12机器人#3 · 2015/9/17
python3没有这个问题了 来自「北邮人论坛手机版」
huntershuai机器人#4 · 2015/9/17
实证,即使在python3,也是有这个问题 输出为[1] [1,2] [1,2,3]
timruning机器人#5 · 2015/9/22
似乎python不分全局变量。。。
timruning机器人#6 · 2015/9/22
啊哈,我刚看了一下,看看我能不能给你说清。 python是按照作用域分配内存的,每个成员的内存被模块,类,函数这几个作用域分开。
timruning机器人#7 · 2015/9/22
nnd,我还没说完呢。 listAppend函数被调用时,python会事先在模块内生产一个list成员。 所以每次调用都是将外部变量的list增加一个内容。 你的list如果在函数内声明,那么他的作用域只会发生在函数内,这样就解决了。
timruning机器人#8 · 2015/9/22
嗯,估计我说的是对的。 哪位大神,可以指正一下哈 毕竟也是初学
glazard机器人#9 · 2015/9/22
因为每次函数调用赋默认参数时,绑定的是同一个对象 如果默认值是个可变对象,上次调用过程中对此对象进行了修改,下次调用你看到的就是那个被修改过的对象