问题
Possible Duplicate:
“Least Astonishment” in Python: The Mutable Default Argument
Consider the following function:
def foo(L = []):
L.append(1)
print L
Each time I call foo it will print a new list with more elements than previous time, e.g:
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]
Now consider the following function:
def goo(a = 0):
a += 1
print a
When invoking it several times, we get the following picture:
>>> goo()
1
>>> goo()
1
>>> goo()
1
i.e. it does not print a larger value with every call.
What is the reason behind such seemingly inconsistent behavior?
Also, how is it possible to justify the counter-intuitive behavior in the first example, why does the function retain state between calls?
回答1:
The default arguments are evaluated once when the function is defined.
So you get the same list
object each time the function is called.
You'll also get the same 0
object each time the second function is called, but since int
is immutable, when you add 1
as fresh object needs to be bound to a
>>> 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
来源:https://stackoverflow.com/questions/6938655/default-values-for-arguments