def addlist(a,lista= []):
print id(lista)
lista.append(a)
return lista
a = addlist('a')
print addlist.func_defaults
print a
b = addlist('b')
print addlist.func_defaults
print addlist.func_defaults
print a
print b
当解释器执行 def
的时候,默认参数也会被计算,并存在函数的 fun_defaults
属性中。由于python
中传递的函数是对象,而且可变对象在调用者和被调用者之间共享,因此当首次计算 addlist('a')
的时候,[]
的到 'a'
并存在了函数的 func_defaults
中,当第二次调用addlist('b')
时, 默认参数并不会重新计算,于是在['a']
的基础上成了['a','b']
。所以多次调用 addlist
函数会导致 addlist.func_defaults
属性值不断增加。从而影响函数的准确性。
正确的写法:
def addlist(a,lista=None):
if lista is None:
lista = []
lista.append(a)
return lista