1

以下のコードが 5 と 2 ではなく 0 と 1 を出力する理由を誰かが知っていますか?

class Myclass:
    a = 0
    b = 1 

def foo():
    for x in range(1):
        for y in range(1):
            myclass = Myclass()
            if y == 1:
                myclass.a = 5
            if y == 1:
                myclass.b = 2
            ClassList.append(Myclass)

    for x in ClassList:
        print x.a   
        print x.b

ClassList = []
foo()   
4

2 に答える 2

2

y決してないので1

>>> range(1)
[0]

あなたが欲しいのはrange(2)

そして、あなたが気付いていない場合に備えて...現在、インスタンス属性ではなくクラス属性としてaandを使用しています。b値の割り当てを行う特定のケースでは、問題は発生しませんが、辞書やリストなどを定義し、それらのオブジェクトのキー/インデックスを変更していた場合、それはすべてのオブジェクトで共有される同じオブジェクトになります。インスタンス。

class Myclass(object):
    a = []
    b = {}

obj1 = Myclass()
obj2 = Myclass()
obj1.a.append('foo')
obj1.b['biz'] = 'baz'
print obj2.a
# ['foo']
print obj2.b
# {'biz': 'baz'}

... vs インスタンス属性

class Myclass(object):
    def __init__(self):
        self.a = []
        self.b = {}
于 2012-12-31T03:43:48.780 に答える
1

その理由は、 ではなくをrange(1)返すため、テストが true と評価されることはありません。[0][0, 1]y == 1

また、リストに追加するのMyclassではなく、myclassつまり、作成したインスタンスではなく実際のクラスをリストに追加しているため、常に変更abれていないクラスからクラスを出力しています。

于 2012-12-31T03:43:52.870 に答える