0

重複の可能性:
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

つまり、呼び出しごとに大きな値を出力するわけではありません。

そのような一見一貫性のない行動の背後にある理由は何ですか?
また、最初の例の直感に反する動作を正当化するにはどうすればよいですか?関数が呼び出し間で状態を保持するのはなぜですか?

4

1 に答える 1

2

デフォルトの引数は、関数が定義されるときに 1 回評価されます。したがってlist、関数が呼び出されるたびに同じオブジェクトを取得します。

02番目の関数が呼び出されるたびに同じオブジェクトも取得しますが、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]

>>> 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
于 2011-08-04T09:01:30.310 に答える