0

可能的重复:
Python 中的“Least Astonishment”:可变默认参数

考虑以下函数:

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

即它不会在每次调用时打印更大的值。

这种看似不一致的行为背后的原因是什么?
此外,如何证明第一个示例中的反直觉行为是合理的,为什么函数在调用之间保持状态?

4

1 回答 1

2

默认参数在定义函数时计算一次。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]

对比

>>> 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
于 2011-08-04T09:01:30.310 回答