参数的默认值

时间:2011-08-04 08:59:48

标签: python function default-arguments

  

可能重复:
  “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

即。每次通话都不会打印出更大的值。

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

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