使用类解决灯泡谜题,但翻转时遇到问题。(Python 3)

1 投票
1 回答
572 浏览
提问于 2025-04-17 13:44

这是一个任务:

我有一个灯光面板,上面有编号为0到1023的灯。
每个灯可以是开着的或者关着的。所有的灯一开始都是关着的。

第一步:

我从0开始,把所有的灯都翻转一下。
这个时候,所有的灯都亮了。

第二步:我从0开始,每隔一个灯翻转一次。
这个时候,灯0、2、4、6、8……都关掉了。
灯1、3、5、7、9……还是亮着的。

第三步:我从0开始,每隔两个灯翻转一次。
所以我翻转灯0、3、6、9、12……
也就是说,如果一个灯是亮的,我就把它关掉;
如果一个灯是关的,我就把它打开。

……

第1023步:
我从0开始,每隔1023个灯翻转一次。
所以我翻转灯0和1023。

问题是:到这个时候,哪些灯是亮的,哪些灯是关的?



这是我的代码:

class Light:

    def __init__(self):
        self.state = 'OFF'

    def turn_on(self):
        self.state = 'ON'

    def turn_off(self):
        self.state = 'OFF'

    def flip(self):
        if self.state == 'OFF':
            self.state = 'ON'
        else:
            self.state = 'OFF'

    def __str__(self):
        return str(self.state)


class LightBoard:

    def __init__(self, num_lights):
        self.light = [Light()] * num_lights

    def step(self,i):
        for element in self.light:
            if self.light.index(element) % i == 0:
                self.light[self.light.index(element)] = self.light[self.light.index(element)].flip()

    def all_steps(self):
        i = 0
        while i != len(self.light):
            self.light = self.light.step(self.light, i)
            i += 1

    def __str__(self):
        return str(self.light)



我使用了Python可视化工具,发现LightBoard中的all_steps没有正常工作。

出现了错误:AttributeError: 'list' object has no attribute 'step'

我在修正这个问题时感到迷茫。
请帮我修正或者给我的代码一些评论。谢谢!

1 个回答

1

一个问题出在

    self.light = [Light()] * num_lights

这需要改成

    self.light = [Light() for _ in range(num_lights)]

否则,self.light 就会指向同一个 Light 对象。

还有其他问题,包括:

  1. 你需要两个层次的循环,而不仅仅是一个。
  2. 下面这行代码有几个错误:self.light = self.light.step(self.light, i)。一个问题是你在 self.light 上调用了 step,而 self.light 是一个列表。

附言:你真的需要为这个写个程序吗?这是一个可以用纸和笔比较容易解决的问题。

撰写回答