You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

修复说明

  1. 新增current_step属性:在初始化时创建,用于跟踪信号灯自启动后的总时间步,每次调用step()时递增。
  2. 重构step方法逻辑:通过current_step % period计算当前在周期内的位置,根据位置判断灯色:周期位置小于green_period时为绿灯,否则为红灯,实现周期性切换。
  3. 简化is_green方法:直接返回颜色判断结果,逻辑更简洁。
  4. 调整输出格式:使用f-string让打印结果与预期输出一致。

内容的提问来源于stack exchange,提问作者user17079709

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:55:31