2011-10-23 10 views
3

Pythonでは、クラスを2回インスタンス化し、2つの異なる変数に格納します。 2番目のオブジェクトに最初のオブジェクトのコピーが含まれているのはなぜですか?私は1つのオブジェクトの値を変更し、他のオブジェクトを変更しないので、コピーであることがわかります。例:私は、その後の値でdataPointsのをクラスをインスタンス化し、埋めるインスタンス化クラスは参照を保持します

class HistoricalData: 
    dataPoints = {} 

::私は再度クラスをインスタンス化し、再び値でそれを埋める

hd1 = HistoricalData() 
hd1.dataPoints["channel1"] = 1 
hd1.dataPoints["channel2"] = 2 
hd1.dataPoints["channel3"] = 3 

私は、次のクラスを持っている

hd2 = HistoricalData() 
hd2.dataPoints["channel1"] = 10 

hd1.dataPointsおよびhd2.dataPointsの値を出力すると、ら次のチャンネル1の値が第二ではないに変更されたため

{'channel1': 1, 'channel2': 2, 'channel3': 3} 
{'channel1': 10, 'channel2': 2, 'channel3': 3} 

辞書は、第二のオブジェクトの最初のコピーを有しています。

クラスをインスタンス化すると、すべての値がクラスで定義された値にデフォルト設定されると考えました。何か不足していますか?

+1

あなたはどこかでミスを犯しました。 Johhnywebの答えは正しい限りですが、上のコードを実行すると、両方のインスタンスの 'dataPoints'の値が' 10'に変更されていることがわかります。辞書は1つしかありません。 「1つのオブジェクトの値を変更して、それを変更しないため、コピーであることはわかっています」 - まあ、そうではありません。 – agf

答えて

10

instance variableではなく、class variableと宣言しました。

の間でクラス変数が共有されています。すべてのインスタンスclassです。つまり、1つを更新すると、HistoricalDataobjectがすべて更新されます。

インスタンス変数はにローカルであり、各インスタンスclassです。これらは通常__init__()特殊メソッドで初期化され、という各インスタンスが作成されたときに呼び出されます。

そのように、あなたはおそらく、あなたが望む結果を得るために、そのようなdatapointsを初期化する必要があります

class HistoricalData(object): 

    def __init__(self): 
     self.dataPoints = {} 
+0

文字列のような単純な型で新しいインスタンス変数を追加した場合、これも__init__で定義する必要がありますか? –

+0

@DannyTsang:タイプの単純さではありません。 'self.name = '''は、インスタンス変数*になるためには '__init __()'(またはそれに類する)の中で等しく*初期化する必要があります*。 – Johnsyweb

+0

ありがとう@Johnsyweb –

関連する問題