Python循环似乎不是迭代

Eoi*_*ray 0 python loops if-statement

以下代码对我不起作用.

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)
Run Code Online (Sandbox Code Playgroud)

输出是

states array length: 2
populating
Run Code Online (Sandbox Code Playgroud)

这是第二次失败

for s in states:
  if s.state == 0
Run Code Online (Sandbox Code Playgroud)

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

谁知道什么是错的?

Jon*_*nts 6

你不需要;的 - 这不是C和co.等等...

class stateClass: 
    state = 0 
Run Code Online (Sandbox Code Playgroud)

在这里你创建一个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)
Run Code Online (Sandbox Code Playgroud)

然后显示状态,执行以下操作:

print Hawaii.state
Run Code Online (Sandbox Code Playgroud)

如果你想要它,property那么它可以避免从课外进行显式设置:

class State(object):
    def __init__(self, number):
        self._state = number
    @property
    def state(self):
        return self._state
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 5

Python不是Java.循环很好,问题是类.

state是一个类变量,而不是实例变量.它由类的所有实例共享.而你实际上根本没有实例化这个类.

改为:

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

states.append(stateClass())
Run Code Online (Sandbox Code Playgroud)

而且你不需要分号.