0

setがPythonのクラス変数の辞書とは異なる動作をするのはなぜですか。例えば、

class Test1:
   x=set()
   y={}

hamster=Test1()
chinchilla=Test1()
hamster.x.add('hi')  # now both sets in both instances have 'hi'
hamster.y['key']=5   # only the hamster instance will contain 5

助けてくれてありがとう:)

編集: init()でself.x = set()を定義すると、両方のインスタンスに追加する問題を回避できることにも気づきました。タイプミスを削除しました

4

1 に答える 1

5

いいえ、あなたは間違っています。両方ともkey:5

In [56]: class Test1:
   ....:        x=set()
   ....:    y={}
   ....: 

In [57]: hamster=Test1()

In [58]: chinchilla=Test1()

In [59]: hamster.x.add('hi')  # now both sets in both instances have 'hi'

In [60]: hamster.y['key']=5

In [62]: hamster.x,chinchilla.x
Out[62]: (set(['hi']), set(['hi']))

In [63]: hamster.y,chinchilla.y
Out[63]: ({'key': 5}, {'key': 5})

実際、コードではインスタンス変数を変更していません。クラス変数を変更しています。

In [65]: Test1.x
Out[65]: set(['hi'])

In [66]: Test1.y
Out[66]: {'key': 5}

ここでインスタンス変数を使用する必要があります。

In [71]: class Test1():
    def __init__(self):
        self.x=set()
        self.y={}
   ....:         
   ....:         

In [75]: hamster=Test1()

In [76]: chinchilla=Test1()

In [77]: hamster.x.add('hi')

In [78]: chinchilla.x.add('bye')

In [79]: hamster.x
Out[79]: set(['hi'])

In [81]: chinchilla.x
Out[81]: set(['bye'])


In [82]: hamster.y['key']=5

In [83]: hamster.y,chinchilla.y
Out[83]: ({'key': 5}, {})
于 2012-10-21T22:56:03.590 に答える