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

这是第二次失败

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

如果条件第二次失败,尽管它是数组中的不同索引,因此 s.state 应该已初始化为 0。所以我认为循环没有正确迭代。

有谁知道怎么了?

4

2 回答 2

6

你不需要;'s - 这不是C和co。ETC...

class stateClass: 
    state = 0 

在这里,您正在创建一个class level attribute- 即,statestateClass.

您正在附加到您的列表stateClass本身 - 即类的定义,而不是类的实际实例......

一旦您更改state其中之一, now 的所有实例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 回答