可能重复:Python中的“最小惊讶”:可变默认参数
考虑以下功能:
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
即每次通话都不会打印出更大的值 .
这种看似不一致的行为背后的原因是什么?
另外,如何在第一个例子中证明反直觉行为的合理性,为什么函数在调用之间保持状态?
1 回答
定义函数时,将对默认参数求值一次 . 因此,每次调用函数时都会得到相同的
list
对象 .每次调用第二个函数时,你也会得到相同的
0
对象,但由于int
是不可变的,当你添加1
时,新的对象需要被绑定到VS