1

重複の可能性:
Pythonの「驚き最小の原則」:可変のデフォルト引数

これが機能することを期待している方法が正しいかどうかを確認したいだけです。これが私が書いているクラスの簡略化されたバージョンです:

class Foo(object):
     def __init__(self):
         pass
     def bar(self, test1=[], test2=[]):
         if test2:
             test1.append(1)
         print test1

さて、私にとって、test1とtest2は、設定されていない限り、関数バーが呼び出されたときに常に空のリストとして設定する必要があります。これは、test1が出力されるとき、リストには1つの項目のみが存在する必要があることを意味します(引数として1つの項目のみを指定する場合)。ただし、これは当てはまりません。

>>> i = Foo()
>>> i.bar()
[]
>>> i.bar(test2=[1])
[1]
>>> i.bar()
[1, 1]
>>> i.bar(test2=[1])
[1, 1, 1]

この場合、整数を使用して同様の結果が期待されます。

class Foo(object):
     def __init__(self):
         pass
     def bar(self, test1=0, test2=0):
         if test2:
             test1 += 1
         print test1

ただし、ここでは、test1は常に0に設定されています。

>>> i = Foo()
>>> i.bar()
0
>>> i.bar(test2=1)
1
>>> i.bar(test2=1)
1
>>> i.bar(test2=1)
1

リストは関数またはクラスの名前空間に永続的であるように見えますが、整数は永続的ではありません。

これは私の側の誤解かもしれないので、いくつかの説明が必要です。

4

1 に答える 1

1

関数の既定の引数は、関数を呼び出すたびに設定されるのではなく、関数が宣言されたときに設定されます。したがって、関数が宣言されたときに作成されるリストは一度だけ作成され、関数を呼び出すたびに参照されます。この質問も参照してください。

リストは可変であるため、それらを変更すると、それを参照するものもすべて変更されます。ただし、整数は不変(変更できない) であるため、変数を別の整数に再割り当てすると、のオブジェクトを参照しているため、その変数のみが変更されます。

于 2013-01-15T09:51:17.667 に答える