开发者

Default values for arguments [duplicate]

开发者 https://www.devze.com 2023-03-26 07:19 出处:网络
This question already has answers here: Closed 11开发者_StackOverflow中文版 years ago. Possible Duplicate:
This question already has answers here: Closed 11开发者_StackOverflow中文版 years ago.

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?


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
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号