猿问

python函数问题

def append(args=[]):

    args.append(0)

    print(args)

append()

append([1])

append()

会输出[0]

[1,0]

[0,0]

想问下为什么第三个会是[0,0]呢,再次调用args的时候还是第一次调用的args为啥呢

wolvvi
浏览 1812回答 2
2回答

Iamxiaoq

在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)

孤独的小猪

 [1]相当于是传一个新的列表进去,并没有用到函数中的 []  , 所以x.append(0) 在这次中,是追加到 [1] 里面,并不是函数默认的[]里面,你要用这种的话,就不能传一个列表进去.def appendx(n, x=[]):     x.append(n)
随时随地看视频慕课网APP

相关分类

Python
我要回答