关于python:参数的默认值

Default values for arguments

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
“Least Astonishment” in Python: The Mutable Default Argument

考虑以下功能:

1
2
3
def foo(L = []):
  L.append(1)
  print L

每次我调用foo,它都会打印一个新的列表,其中包含比以前更多的元素,例如:

1
2
3
4
5
6
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]

现在考虑以下功能:

1
2
3
def goo(a = 0):
  a += 1
  print a

当多次调用它时,我们得到以下图片:

1
2
3
4
5
6
>>> goo()
1
>>> goo()
1
>>> goo()
1

也就是说,它不会在每次调用时打印更大的值。

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


在定义函数时,将对默认参数进行一次计算。所以每次调用函数时都会得到相同的list对象。

每次调用第二个函数时,也会得到相同的0对象,但由于int是不可变的,因此当添加1作为新对象需要绑定到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> 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