5

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

名前と子のリストを持つPersonクラスを作成しました。子供たちは同じPersonクラスです。2つのPersonインスタンスを作成し、1つのPersonインスタンスに子を追加すると、両方のPersonインスタンスに追加されます。子はperson1の子にのみ追加され、person2には追加されないはずですが、両方に追加されます。私は明らかに間違ったことをしているに違いありませんが、私はそれを見ることができません。

同様の質問は、コンストラクターではなくクラス自体に変数定義を追加する人々を示しましたが、それはここで起こっていることではありません。どんな助けでも大歓迎です、それは私の脳を揚げています!

コードと出力については、以下を参照してください。

class Person(object):

    def __init__(self, name, children=[]):
        self.name = name
        self.children = children

    def __repr__(self):
        return '<' + self.name + '>'

    def add_child(self, child):
        self.children.append(child)


def main():
    person1 = Person('Person1')
    person2 = Person('Person2')

    person1.add_child(Person("Person 1's child"))

    print "Person 1's children:", person1.children
    print "Person 2's children:", person2.children

if __name__ == "__main__":
    main()

このコードの出力は次のとおりです。

Person 1's children: [<Person 1's child>]
Person 2's children: [<Person 1's child>]
4

2 に答える 2

10

問題は、childrenパラメータのデフォルト値にあります。可変オブジェクト(リストなど)を使用してヘッダーで初期化すると、一度だけ初期化されてから、すべてのインスタンスで使用されます。

これについてはここで説明しました。

交換してみてください

def __init__(self, name, children=[]):
    self.name = name
    self.children = children

def __init__(self, name, children=None):
    self.name = name
    if children is None:
        self.children = []
    else:
        self.children = children
于 2013-01-25T13:15:43.487 に答える
2

initには、代わりにこれを使用してください。

def __init__(self, name, children=None):
    self.name = name
    if children is None:
        self.children = []
    else:
        self.children = children

何が起こっているのかというと、2つのPersonオブジェクトがバックグラウンドで同じリストを使用しているということです(リストは、関数が実行されたときではなく、定義されたときにバインドされます)。もう少し議論するためにこの質問を見てください。

于 2013-01-25T13:16:13.327 に答える