参数的默认值

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

即每次通话都不打印较大的值。

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


当函数被定义时,默认参数被评估一次。 所以每次调用函数时都会得到相同的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
链接地址: http://www.djcxy.com/p/4885.html

上一篇: Default values for arguments

下一篇: gotchas to be aware of