4

この簡単な例を見てください。o1 が「Hello Alex」を 2 回出力する理由がよくわかりません。デフォルトの self.a のため、常に空のリストにリセットされると思います。誰かがここでの理論的根拠を説明してもらえますか? どうもありがとう。

class A(object):
        def __init__(self, a=[]):
            self.a = a

o = A()
o.a.append('Hello')
o.a.append('Alex')
print ' '.join(o.a)

# >> prints Hello Alex

o1 = A()
o1.a.append('Hello')
o1.a.append('Alex')
print ' '.join(o1.a)

# >> prints Hello Alex Hello Alex
4

2 に答える 2

12

変更可能なデフォルト関数引数に関するこの落とし穴を読んでください: http://www.ferg.org/projects/python_gotchas.html

要するに、定義すると

def __init__(self,a=[])

デフォルトで self.a によって参照されるリストは、実行時ではなく、定義時に一度だけ定義されます。o.a.appendしたがって、またはを呼び出すたびにo1.a.append、同じリストが変更されます。

これを修正する一般的な方法は、次のように言うことです。

class A(object):
    def __init__(self, a=None):
        self.a = [] if a is None else a

self.a=[]関数の本体に移動することにより、定義時ではなく、 __init__実行時に (呼び出されるたびに) 新しい空のリストが作成されます。__init__

于 2010-04-19T13:24:25.293 に答える
6

次のような Python のデフォルト引数:

def blah(a="default value")

は一度評価され、すべての呼び出しで再利用されるため、 a を変更すると、 a をグローバルに変更します。考えられる解決策は次のとおりです。

def blah(a=None):
  if a is None
    a = []

この問題の詳細については、http: //www.ferg.org/projects/python_gotchas.html#contents_item_6を参照してください。

基本的に、リストやディクショナリなどの変更可能なオブジェクトを引数のデフォルト値に使用しないでください。

于 2010-04-19T13:24:59.067 に答える