使用类解决灯泡谜题,但翻转时遇到问题。(Python 3)
这是一个任务:
我有一个灯光面板,上面有编号为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
对象。
还有其他问题,包括:
- 你需要两个层次的循环,而不仅仅是一个。
- 下面这行代码有几个错误:
self.light = self.light.step(self.light, i)
。一个问题是你在self.light
上调用了step
,而self.light
是一个列表。
附言:你真的需要为这个写个程序吗?这是一个可以用纸和笔比较容易解决的问题。