30

私は1週間前にPythonでコーディングを開始しましたが、すぐにoops、classes、objectsを使用してコーディングを開始したのは私の間違いです。私は自分のC++の習熟度が役立つと思いました...私は次のコードで少し得ました

class A:
     var=0
     list=[]
     def __init__(self):
            pass

驚いたことに、varとlistは一種のグローバル変数であり、すべてのインスタンスで共有されているようです。すべてのインスタンスで異なっていると思いました。理解するのに半日かかりました。それ....変数はクラスオブジェクトによってのみアクセスできるが、すべてのインスタンス間で共有されるということは少しも意味がありません.......ただ好奇心が強い、その背後に理由がありますか? ??

4

4 に答える 4

33

varinstance.varまたはでアクセスする限り、絶対に共有しないでくださいself.var。ただし、リストを使用すると、クラスが評価されるときにステートメントが実行し、1つのリストインスタンスが作成されてクラスdictにバインドされるため、すべてのインスタンスが同じリストになります。instance.list = somethingelserespを設定するときはいつでも。self.list = somethingelse、インスタンスレベルの値を取得する必要があります。

時間の例:

>>> class A():
...     var = 0
...     list = []
...
>>> a = A()
>>> b = A()
>>> a.var
0
>>> a.list
[]
>>> b.var
0
>>> b.list
[]
>>> a.var = 1
>>> b.var
0
>>> a.list.append('hello')
>>> b.list
['hello']
>>> b.list = ['newlist']
>>> a.list
['hello']
>>> b.list
['newlist']
于 2012-06-14T20:01:20.923 に答える
17

これらは基本的にJavaの静的変数のようなものです。

// Example equivalent Java
class A {
    static int var = 0;
    static String[] list;
}

これは意図された動作です。クラス変数はクラス用です。

通常のインスタンス変数の場合、コンストラクターでそれらを宣言します。

class A:
    def __init__(self):
        self.var = 0
        self.list = []

Pythonの静的クラス変数を確認することをお勧めします。

于 2012-06-14T19:59:32.073 に答える
6

その理由は、Pythonではclass他のステートメントと同じように実行される実行可能ステートメントであるためです。クラス定義の本体は、クラスが定義されるときに1回実行されます。そこに行行var = []がある場合、それは1回だけ実行されるため、その行の結果として作成できるリストは1つだけです。

于 2012-06-14T20:03:54.317 に答える
3

の場合はこの動作が表示されないことに注意してくださいvar。次の場合にのみ表示されlistます。

>>> class A:
...     var = 0
...     list = []
... 
>>> a1 = A()
>>> a2 = A()
>>> a1.var = 3
>>> a2.var
0
于 2012-06-14T20:00:37.767 に答える