2016-09-02 8 views
0

クラス変数の仕組みについてのアイデアを把握しようとしています。私の知る限り、クラス変数はクラスインスタンス(オブジェクト)間で共有されます。 その考えの中で、クラス変数を変更すると、その値はすべてのクラスインスタンスに変更されるはずです... ...しかし、これは必ずしもそうではないようです。クラス変数奇数(自己なし)

以下は簡単な例です:

class A: 
    name = "Dog" 

a1 = A() 
a2 = A() 

# These both change the value only for an instance 
a1.name = "Cat" 
a2.name += " is an animal" 
print(a1.name, a2.name) 


class B: 
    number = 0 

b1 = B() 
b2 = B() 

# Again only changes value for an instance 
b1.number = 2 
print(b1.number, b2.number) 


# This is the weird one. 
class C: 
    lista = [] 

c1 = C() 
c2 = C() 

# Changes the value for BOTH/ALL instances. 
c1.lista.append(5) 
c2.lista.append(6) 
print(c1.lista, c2.lista) 

# But this one only changes the value for an instance. 
c1.lista = [1, 2, 3] 
print(c1.lista, c2.lista) 
+0

あなたはギリシャですか?好奇心の外に – cssGEEK

答えて

2

クラス変数が同じ名前でインスタンス変数にを割り当てる瞬間までインスタンス間で共有されています。 (余談として、この動作は継承状況でデフォルトを宣言するのに便利です。)

>>> class X: 
... foo = "foo" 
... 
>>> a = X() 
>>> b = X() 
>>> c = X() 
>>> c.foo = "bar" 
>>> id(a.foo) 
4349299488 
>>> id(b.foo) 
4349299488 
>>> id(c.foo) 
4349299824 
>>> 

あなたのリストの例は、共有インスタンスが最初に、その後、c1.listaに新しい値を再割り当て変異するが、c2.listaは共有インスタンスのまま。

+0

ああ、これは便利なものです。今私はそれが私が考えることを理解する。基本的には、インスタンス間に「グローバル」値を持たせることができ、必要に応じてインスタンスの一部に値を割り当てることができます。再度必要がない場合は、ローカル変数を削除してグローバル値に戻すことができます。 –

関連する問題