1

コンストラクターで attr の値を指定しないと、複数のインスタンス (i1 と i2) が同じ「attr」オブジェクトに割り当てられます。コンストラクターで値を明示的に指定すると、異なるオブジェクトが得られます。

サンプルコード:

class MyClass:
    def __init__(self, x=1, attr=[]):
        print id(attr)
        self.attr = attr
        self.x = x

if __name__ == '__main__':
   
    i1 = MyClass()
    i2 = MyClass()
    i3 = MyClass(attr=[1,2])
    i4 = MyClass(attr=[1,2])

    print "i1:", vars(i1), id(i1.attr)
    print "i2:", vars(i2), id(i2.attr)
    print "i3:", vars(i3), id(i3.attr)
    print "i4:", vars(i4), id(i4.attr)

出力:

38648928
38648928
38664672
38688648
i1: {'x': 1, 'attr': []} 38648928
i2: {'x': 1, 'attr': []} 38648928
i3: {'x': 1, 'attr': [1, 2]} 38664672
i4: {'x': 1, 'attr': [1, 2]} 38688648

i1 と i2 が同じ 'attr' オブジェクトを持っているのはなぜですか?

4

1 に答える 1

3

デフォルト リストを作成しますattr=[]。リストは一度だけ作成されました。を参照せずにメソッドにアクセスするたびに、以前に作成attrしたデフォルトのリストが使用されます。attr=[]2番目の例では、の呼び出しごとに常に新しいリストを作成しますMyClass(attr=[1,2])

于 2013-11-02T22:30:27.610 に答える