1

これは単純なはずです...

class Object:
    x = 0
    y = []

a = Object()
b = Object()

a.x = 1
b.x = 2
print a.x, b.x
# output: 1 2
# works as expected

a.y.append(3)
b.y.append(4)
print a.y, b.y
# output: [3, 4] [3, 4]
# same list is referenced  how to fix?
# desired output: [3] [4]

私が知る限り、同じリストa.yを参照してください。b.yどうすればそれらを分離させることができますか?できれば、__init__メソッドを追加せずに。

4

4 に答える 4

3

yクラスを定義するときに、一度だけの値を作成しています。の各インスタンスに異なるリストを割り当てるにはy、init 関数が必要です。入れるだけself.y = []__init__、意図したとおりに機能します。

于 2012-05-03T18:53:05.533 に答える
2

ここで起こっていることは、x をインスタンスレベルの属性として実際に再定義したことであり、クラス定義にはそれらが両方のクラスレベルの属性として含まれています。

これを行うと、元の x がまだ 0 のままであることがわかります。

>>> Object.x
0

新しいリストを作成しないため、class 属性を使用しています。これを行う場合:

>>> a.y = []
>>> b.y = []
>>> a.y.append(1)
>>> b.y.append(2)
>>> print a.y, b.y
[1] [2]

それがあなたが期待していることです。実際には、次のようにクラスを定義する必要があります。

class Object(object):
    def __init__(self):
        self.y = []
        self.x = 0

(そして Object をクラス名として使用しないでください!)

于 2012-05-03T18:58:23.283 に答える
1

クラスプロパティの代わりにインスタンスプロパティをセットアップする最も簡単な方法は、__init__

インスタンスプロパティ ( など)を参照するa.yと、パーサーは最初にそれを返そうとしますが、見つからない場合はクラスプロパティ ( Object.y) が返されます。

あなたの場合、すべてのインスタンスで共有されるクラスプロパティのみを定義しました。

于 2012-05-03T19:01:18.807 に答える
1

それを行う唯一の方法は、__init__メソッドを作成することです

class Object:
  def __init__(self):
    self.x = 0
    self.y = []

そうすれば、オブジェクトの構築時に新しい値が割り当てられx、新しいリストが作成さyます。

前に行っていた方法では、オブジェクトに 2 つのクラス/静的変数を作成yしますが、オブジェクトのすべてのインスタンスに反映される真のリストへの参照のみを静的に保持するため、同じままです。

この他の質問のクラス/静的変数の詳細: Python の静的クラス変数

*間違った用語を使用していたら申し訳ありません。私はどちらかというと Java 派です ;-)

于 2012-05-03T19:07:54.837 に答える