Python でクラス属性について話すときの一般的な例は次のとおりです。
Python 2.7.6 (default, Sep 9 2014, 15:04:36)
>>> class B(object):
... cv = []
...
>>> b1 = B()
>>> b2 = B()
>>> b1.cv, b2.cv, B.cv
([], [], [])
>>> b1.cv.append(1)
>>> b1.cv, b2.cv, B.cv
([1], [1], [1])
>>> b2.cv.append(2)
>>> b1.cv, b2.cv, B.cv
([1, 2], [1, 2], [1, 2])
>>> B.cv.append(3)
>>> b1.cv, b2.cv, B.cv
([1, 2, 3], [1, 2, 3], [1, 2, 3])
クラス属性がクラスとそのすべてのインスタンス間で共有されていることを示しています。
しかし、クラス属性の値を再代入すると、つまり、クラス属性にバインドされた初期オブジェクトを変更しないと、次のようになります。
>>> class A(object):
... cv = 0
...
>>> a1 = A()
>>> a2 = A()
>>> a1.cv, a2.cv, A.cv
(0, 0, 0)
>>> a1.cv = 1
>>> a1.cv, a2.cv, A.cv
(1, 0, 0)
>>> a2.cv = 2
>>> a1.cv, a2.cv, A.cv
(1, 2, 0)
>>> A.cv = 3
>>> a1.cv, a2.cv, A.cv
(1, 2, 3)
ここで、このクラス属性が一意の値を格納するたびに、インスタンスとクラスの両方の名前空間に適用される次の割り当てでオーバーライドされないことがわかります。
なぜこのような振る舞いになるのでしょうか。
「不変」(A)および「可変」(B)の場合に「関連性のない」動作につながるこのロジックがどのようなものなのか理解できません。これにより、「使用する意味がない」と思いますクラス変数」は間違いを起こしやすいので...
このトンネルに光が見えないのは私だといいのですが…