def append(args=[]): args.append(0) print(args)append()append([1])append()会输出[0][1,0][0,0]想问下为什么第三个会是[0,0]呢,再次调用args的时候还是第一次调用的args为啥呢
2 回答
已采纳
Iamxiaoq
TA贡献33条经验 获得超6个赞
在python里面,一切切对象,函数也是对象,函数这个对象有个特殊的__defaults__属性存储着其在定义的时候声明的默认参数
这个__defaults__随着函数的定义而生成,第27
如果调用时没有传递参数,则使用存储在__defaults__中的值,第28
由于第28调用了__defaults__中的list.append(0),调用完成后__defaults__中的list的值为[0],第29
第30append([1]),此次调用传递了值,则不使用默认参数,可以看到两个id不一样
第30调用完成后也不影响__defaults__中的list,第31
第32的调用也没有传递参数,则使用__defaults__中保存的list,经过第28后,默认参数list的值为:[0],此时再执行[0].append(0),得到的自然是[0,0], 输出的id与28输出的id一致,证明他们是同一个list。。。。
所以,默认参数一般不要使用可变对象
def append(args=None): if args is None: args = [] args.append(0) print(args)
孤独的小猪
TA贡献232条经验 获得超302个赞
[1]相当于是传一个新的列表进去,并没有用到函数中的 [] , 所以x.append(0) 在这次中,是追加到 [1] 里面,并不是函数默认的[]里面,你要用这种的话,就不能传一个列表进去.
def appendx(n, x=[]): x.append(n)
添加回答
举报
0/150
提交
取消