2

私は最初の Python プログラムを書いていますが、奇妙なことに遭遇しました。

私のプログラムは次のようになります。

def main():
  listOfThings = []
  for i in range(0,3):
    newThing = thing()
    newThing.listOfStrings.append('newString')
    listOfThings.append(newThing)

単純に次のようになります。

class thing:
  listOfStrings = []

私は listOfThings が次のようになることを期待しています:

listOfThings
 -thing1
  -newString
 -thing2
  -newString
 -thing3
  -newString

しかし、代わりに私はこれを得ています:

listOfThings
 -thing1
  -newString
  -newString
  -newString
 -thing2
  -newString
  -newString
  -newString
 -thing3
  -newString
  -newString
  -newString

他の言語では、thing.listOfStrings が static である場合、これが期待されるものです。ここで見逃しているpythonの微妙な点はありますか?

4

2 に答える 2

4

listOfStringsクラス属性です。すべてのインスタンスが同じlist

代わりに、属性を追加する必要があります__init__

class thing:
    def __init__(self):
        self.listOfStrings = []
于 2012-09-16T06:35:37.367 に答える
4

Python では、クラス スコープで宣言された「変数」は、他の言語の静的クラス メンバーに似たクラス属性になります。thing.listOfStringsクラス名またはインスタンスのいずれかを介してアクセスできますnewThing.listOfStringsが、常に同じ属性を参照します。

インスタンス属性が必要な場合は、__init__メソッドで作成します。

class Thing:
    def __init__(self):
        self.listOfStrings = []

Thingusingの新しいインスタンスをインスタンス化するたびに、 が新しいインスタンスでThing()実行__init__され、独自のlistOfStringsリストが与えられます。

Python の動的な性質により__init__、インスタンス属性を追加できる唯一の場所ではないことに注意してください (推奨される場所ですが)。たとえば、次は合法です。

class Foo:
    pass # empty class definition

a = Foo()
a.x = 42
print a.x # prints 42

b = Foo()
b.y = 99
print b.x # raises AttributeError
print b.y # prints 99
于 2012-09-16T06:43:36.190 に答える