2011-06-28 7 views
-1

私はPythonの初心者です。私はそのバグを信じています。Python - なぜこれが起こっていますか?

編集2011-09-30: 忘れてしまった。今私は作成された属性が静的で、インスタンス間で共有されていることを知っています。 このスレッドは、私と同じ状況で別のPython初心者を助けてくれることを願っています。今すぐ質問

class test(): 

    dictionary1 = {} 
    list1 = [] 

    def method1(self): 
     self.dictionary1.update({'1': 'unique entry'}) 
     self.list1 = ['unique list entry'] 

t=test() 

print 'dictionary1 value:', t.dictionary1 
print 'list1 value:', t.list1 
t.method1() 
print 'dictionary1 new value:', t.dictionary1 
print 'list1 new value:', t.list1 

t2=test() 
print 'dictionary1 value:', t2.dictionary1, " -- error -- I just instantiated the class. The correct value would be {}" 
print 'list1 value:', t.list1 
t2.method1() 
print 'dictionary1 new value:', t.dictionary1 
print 'list1 new value:', t.list1 

は、次のコードを考えてみましょう

ライン19で実行されるコードを示して、なぜ:{'1': 'unique entry'}が。 [](ライン20で空のリスト)

Using Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2 

英語申し訳ありませんがあまりよくありません。リストが正しい値を持っていることを{} 注:私はそれを信じだろう。ブラジルから。

編集2011-09-30: 忘れてしまった。今私は作成された属性が静的で、インスタンス間で共有されていることを知っています。 このスレッドは、私と同じ状況で別のPython初心者を助けてくれることを願っています。

+24

ルール番号。 1:バグはあなたのコードまたは機能の理解にあるが、成熟した、よくテストされた実装ではない。 – delnan

+2

あなたのコードは完全に壊れています。実際に動作するものを投稿してください。 – Daenyth

+0

'self.list1 = ['一意のリストエントリ']のインデントは正しいですか? 'method1'の中にないようです。 – thegrinner

答えて

14

testクラスのすべてのインスタンスは、同じ辞書とリストを共有します。メンバを初期化する正しい方法は、次のようになります。

class Test(): 
    def __init__(self): 
     self.dictionary1 = {} 
     self.list1 = [] 

クラスボディに直接割り当てられた属性は、一度評価されてからすべてのインスタンスで共有されます。 __init__メソッドはインスタンスごとに1回実行されるため、各インスタンスに対して新しいリストと辞書が作成されます。

+3

彼らは、OPが宣言したものがクラス変数(他の言語の静的メンバーに似ている)のためにそれらを共有します。 – delnan

7

クラス本体で直接宣言された変数(static class variables)は、クラスのすべてのインスタンスで共有されます。したがって、それらを変更することは良い考えではありません。

代わりに、コンストラクタでオブジェクトのメンバ変数を初期化します。

class test(object): 
    def __init__(self): 
     self.dictionary1 = {} 
    def method1(self): 
     self.dictionary1.update({'1': 'unique entry'}) 
5

を他の回答に追加するには、あなたがdictlistに異なる振る舞いを参照してください理由は次のとおりです。あなたがself.dictionary1.update({'1': 'unique entry'})を書くとき、あなたは変更self.dictionary1の内容ですが、まだ同じですdictオブジェクトです。 self.list1 = ['unique list entry']と書くと、self.list1が新しいlistオブジェクトに置き換えられます。あなたは、self.list1.append('unique list entry')を実行してdictと同じ動作をします。

+0

'self.list1 = ...'は何も置き換えていません。何も置き換えないので、インスタンスの '__dict__'には 'list1'というキーがありません。単にそれを追加するだけです。クラスの – SingleNegationElimination

+0

はすみませんでした。クラスの属性を隠すインスタンスに属性を追加しています。 –

関連する問題