可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
考虑以下功能:
def foo(L = []):
L.append(1)
print L
每次调用foo时,它都会打印一个包含比以前更多元素的新列表,例如:
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]
现在考虑以下功能:
def goo(a = 0):
a += 1
print a
多次调用时,我们得到以下图片:
>>> goo()
1
>>> goo()
1
>>> goo()
1
即。每次通话都不会打印出更大的值。
这种看似不一致的行为背后的原因是什么? 另外,如何在第一个例子中证明反直觉行为的合理性,为什么函数在调用之间保持状态?
答案 0 :(得分:1)
默认参数在定义函数时计算一次。
因此,每次调用函数时都会得到相同的list
对象。
每次调用第二个函数时,您也会获得相同的0
对象,但由于int
是不可变的,因此当您添加1
时,需要将新对象绑定到一个
>>> def foo(L = []):
... print id(L)
... L.append(1)
... print id(L)
... print L
...
>>> foo()
3077669452
3077669452
[1]
>>> foo()
3077669452
3077669452
[1, 1]
>>> foo()
3077669452
3077669452
[1, 1, 1]
VS
>>> def foo(a=0):
... print id(a)
... a+=1
... print id(a)
... print a
...
>>> foo()
165989788
165989776
1
>>> foo()
165989788
165989776
1
>>> foo()
165989788
165989776
1