Python交通信号灯模拟类故障排查:状态未按周期切换
交通信号灯模拟代码问题排查
我在构建交通模拟系统的信号灯模块,编写了代表交通信号灯的Light类,包含period(两次绿灯转红灯的时间步间隔)和green_period(绿灯持续时间步)属性。期望信号灯按设定周期交替切换绿灯与红灯,但运行demo_light函数后,初始绿灯之后就一直保持红灯,和预期输出不符,需要排查问题。
预期输出
0 (G) True
1 (G) True
2 (G) True
3 (R) False
4 (R) False
5 (R) False
6 (R) False
7 (G) True
8 (G) True
9 (G) True
10 (R) False
11 (R) False
12 (R) False
13 (R) False
14 (G) True
实际输出
0 G True
1 R False
2 R False
3 R False
4 R False
5 R False
6 R False
7 R False
8 R False
9 R False
10 R False
11 R False
12 R False
13 R False
14 R False
原代码
class Light: """Represents a traffic light""" def __init__(self, period, green_period): self.period = period self.green_period = green_period self.color = 'G' def __str__(self): return self.color def __repr__(self): pass def step(self): time = 0 while True: time += 1 if time < self.green_period: self.color = 'G' else: self.color = 'R' if time == self.green_period: break def is_green(self): if self.color == 'G': return True elif self.color == 'R': return False def demo_light(): """Demonstrats the Light class""" a_light = Light(7, 3) for i in range(15): print(i, a_light, a_light.is_green()) a_light.step() def main(): """Demonstrates the classes""" print('\nLight demonstration\n') demo_light() if __name__ == '__main__': main()
问题分析
核心问题出在step方法的实现上:
- 局部变量
time每次调用都会重置:每次调用step()时,time都会被重新初始化为0,循环执行到time == green_period(即3)时退出,退出前最后一步time=3满足time >= green_period,颜色被设为R,之后每次调用step()都会重复这个过程,导致颜色一直保持R。 - 缺少全局时间步跟踪:信号灯需要记录自启动以来的总时间步,才能根据
period计算当前所处的灯色阶段,而不是每次都从头计算。
修复后的代码
class Light: """Represents a traffic light""" def __init__(self, period, green_period): self.period = period self.green_period = green_period self.color = 'G' self.current_step = 0 # 记录当前总时间步 def __str__(self): return self.color def __repr__(self): pass def step(self): self.current_step += 1 # 计算当前在周期内的位置 cycle_position = self.current_step % self.period if cycle_position < self.green_period: self.color = 'G' else: self.color = 'R' def is_green(self): return self.color == 'G' def demo_light(): """Demonstrats the Light class""" a_light = Light(7, 3) for i in range(15): print(f"{i} ({a_light}) {a_light.is_green()}") a_light.step() def main(): """Demonstrates the classes""" print('\nLight demonstration\n') demo_light() if __name__ == '__main__': main()
修复说明
- 新增
current_step属性:在初始化时创建,用于跟踪信号灯自启动后的总时间步,每次调用step()时递增。 - 重构
step方法逻辑:通过current_step % period计算当前在周期内的位置,根据位置判断灯色:周期位置小于green_period时为绿灯,否则为红灯,实现周期性切换。 - 简化
is_green方法:直接返回颜色判断结果,逻辑更简洁。 - 调整输出格式:使用f-string让打印结果与预期输出一致。
内容的提问来源于stack exchange,提问作者user17079709
相关产品推荐
相关产品推荐

