0

以下のコードは、私にとって期待どおりに機能していません。

class stateClass:
  state = 0

states = []
states.append(stateClass)
states.append(stateClass)

def populateStates(states):
  for s in states:
    if s.state == 0
      print 'populating'
      s.state = 1

populateStates(states)

出力は

states array length: 2
populating

これは2回目の失敗です

for s in states:
  if s.state == 0

配列内の異なるインデックスであるため、条件付きが2回目に失敗した場合、s.stateは0に初期化されているはずです。そのため、ループが適切に繰り返されていないと思います。

誰が何が悪いのか知っていますか?

4

2 に答える 2

6

は必要ありません;。これは C と co ではありません。等...

class stateClass: 
    state = 0 

ここで を作成していますclass level attribute- つまり、stateのすべてのインスタンスで共有されますstateClass

リストstateClass自体に追加しています-つまり、クラスの実際のインスタンスではなく、クラスの定義です...

それらのいずれかを変更stateするとすぐに、すべてのインスタンスstateClassがその変更された値を持ちます。

ほとんどの場合、インスタンスを作成したいと思うでしょう:

class State(object):
    def __init__(self, number):
        self.state = number

Hawaii = State(50)  
Kentucky = State(23) # (making state numbers up here...) 

my_states = []
my_states.append(Hawaii)
my_states.append(Kentucky)

状態を表示するには、次のようにします。

print Hawaii.state

必要な場合はproperty、クラス外からの明示的な設定を回避します。

class State(object):
    def __init__(self, number):
        self._state = number
    @property
    def state(self):
        return self._state
于 2012-09-10T10:54:48.150 に答える
5

Python は Java ではありません。ループは問題ありません。問題はクラスです。

stateインスタンス変数ではなく、クラス変数です。クラスのすべてのインスタンスで共有されます。そして、実際にはクラスをまったくインスタンス化していません。

代わりにこれを行います:

class stateClass(object):
  def __init__(self):  
    self.state = 0

states.append(stateClass())

また、セミコロンは必要ありません。

于 2012-09-10T10:53:38.003 に答える