我使用此代码:
class Car:
def __init__(self):
self.start == [0, roads[0].index('#')]
while roads[self.start[0]][self.start[1]] == '#':
self.start[0] = randint(0, len(roads)-1)
self.start[1] = randint(0, len(roads[0])-1)
self.start = tuple(self.start)
self.finish == [0, roads[0].index('#')]
while roads[self.finish[0]][self.finish[1]] == '#':
self.finish[0] = randint(0, len(roads)-1)
self.finish[1] = randint(0, len(roads[0])-1)
self.finish = tuple(self.finish)
self.kind = randint(0, 1)
它的作用是:在这样的地图中:
#############1#########
#############1111######
#############1##1######
#######1111111111######
#############1#########
#############1#########
它找到两个1并将它们设置为开始和结束,然后它随机选择另一个变量。然后我这样做:
a = Car()
b = Car()
只是发现它们两者始终具有相同的开始和结束,但有时会有不同的类型。我不明白 - 如果有一个随机不工作的问题,它也不应该在self.kind上工作!
我该如何解决?
答案 0 :(得分:4)
您在这里使用了相等测试:
self.start == [0, roads[0].index('#')]
除非你在班级有start
属性,否则会失败;它是不分配,它正在测试那里的平等。你在这里得到NameError
!
所以,你可能做有一个Car.start
类属性,它是一个可变类型,如列表:
class Car:
start = [0, 0]
但忘记在你的问题中加入。
然后分配给self.start
索引,类属性:
self.start[0] = randint(0, len(roads)-1)
self.start[1] = randint(0, len(roads[0])-1)
这是共享数据,因为这会修改类属性!
最后,设置一个实例属性:
self.start = tuple(self.start)
包含共享数据。这同样适用于您的self.finish
属性。
您可以使用 assign 而不是相等测试来解决此问题:
self.start = [0, roads[0].index('#')]
同样适用于self.finish
:
self.finish == [0, roads[0].index('#')]
您也可以在此处使用本地名称,并在构建完列表后仅分配给实例属性。
答案 1 :(得分:2)
您可能应该将作业更改为:
self.start = [0, roads[0].index('#')]
和此:
self.finish = [0, roads[0].index('#')]
目前,您正在使用比较运算符。