编写MIT 6.01SC状态机代码遇TypeError,未迭代却报'int不可迭代'
TypeError: 'int' object is not iterable 排查方案(针对MIT 6.01SC状态机代码)
我来帮你搞定这个报错!先看核心问题:你的代码里step方法有一行(s,o) = self.getNextValues(self.state, input),这行要求getNextValues必须返回一个包含两个元素的可迭代对象(比如元组),如果它返回的是单个整数,Python会尝试把这个int拆成两个变量,自然会报“int不可迭代”的错误。
先把你的代码整理出来方便分析:
class sm(object): def start(self): self.state = self.startState def step(self, input): # 这里需要getNextValues返回二元组来解压 (s,o) = self.getNextValues(self.state, input) self.state = s return o def transduce(self, inputs): self.start() return [self.step(input) for input in inputs] class delay(sm): def __init__(self,v0): self.startState = v0 def getNextValues(self, state, input): # 这里返回的是(input, state),是符合要求的二元组 return (input, state) class cascade(sm): def __init__(self, a, b... # 你这里的cascade类没写完,尤其是缺少核心的getNextValues方法!
可能的报错原因&解决方法:
cascade类未完整实现
getNextValues
你只写了cascade的构造函数开头,完全没实现核心的getNextValues方法。如果直接用这个类,要么会因为找不到方法报错,要么如果你私下写了但返回的是单个值(比如只返回了子状态机的状态或输出),就会触发这个迭代错误。正确的
cascade类实现应该是这样的(把两个状态机串联,前一个的输出作为后一个的输入):class cascade(sm): def __init__(self, a, b): self.a = a self.b = b # 级联状态机的初始状态是两个子状态机的初始状态组成的元组 self.startState = (a.startState, b.startState) def getNextValues(self, state, input): # 拆解当前的级联状态 a_current_state, b_current_state = state # 获取第一个状态机的下一个状态和输出 a_next_state, a_output = self.a.getNextValues(a_current_state, input) # 把第一个的输出作为第二个的输入,获取第二个的下一个状态和最终输出 b_next_state, b_output = self.b.getNextValues(b_current_state, a_output) # 返回新的级联状态(元组)和最终输出 return ((a_next_state, b_next_state), b_output)其他自定义状态机的
getNextValues返回值不符合要求
如果你还写了其他继承自sm的类,检查它们的getNextValues是否都返回了(next_state, output)这样的二元组,哪怕其中一个是int,也要打包成元组返回(比如(new_state, 0)而不是new_state)。
验证步骤:
先单独测试delay类是否正常工作,排除基础问题:
d = delay(0) print(d.transduce([1,2,3])) # 预期输出:[0,1,2]
如果这个测试没问题,那肯定是cascade类的实现问题,补全上面的代码再测试就好了。
内容的提问来源于stack exchange,提问作者FDuldul
相关产品推荐
相关产品推荐

