Python–;随机实际上不是随机的

Python–;随机实际上不是随机的,python,random,Python,Random,我使用以下代码: 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

我使用以下代码:

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起作用

如何修复它?

您可能应该将您的作业更改为:

self.start = [0, roads[0].index('#')]
这是:

self.finish = [0, roads[0].index('#')]

现在,您正在使用比较运算符。

您可能应该将分配更改为:

self.start = [0, roads[0].index('#')]
这是:

self.finish = [0, roads[0].index('#')]

现在,您正在使用比较运算符。

您正在这里使用相等测试:

self.start == [0, roads[0].index('#')]
这将失败,除非您在类级别具有
start
属性;它是而不是分配,它是在测试那里的平等性。你会在这里得到一个
namererror

因此,您可能有一个
Car.start
class属性,它是一个可变类型,如列表:

class Car:
    start = [0, 0]
但你忘了在你的问题中包括这一点

然后将class属性指定给
self.start
索引:

self.start[0] = randint(0, len(roads)-1)
self.start[1] = randint(0, len(roads[0])-1)
self.start = tuple(self.start)
这是共享数据,因为这会修改class属性

最后,设置一个实例属性:

self.start[0] = randint(0, len(roads)-1)
self.start[1] = randint(0, len(roads[0])-1)
self.start = tuple(self.start)
包含共享数据。这同样适用于您的
self.finish
属性

您可以通过使用赋值而不是相等性测试来解决此问题:

self.start = [0, roads[0].index('#')]
这同样适用于
self.finish

self.finish == [0, roads[0].index('#')]

您也可以在此处使用本地名称,并在构建完列表后仅将其分配给实例属性。

您在此处使用的是相等性测试:

self.start == [0, roads[0].index('#')]
这将失败,除非您在类级别具有
start
属性;它是而不是分配,它是在测试那里的平等性。你会在这里得到一个
namererror

因此,您可能有一个
Car.start
class属性,它是一个可变类型,如列表:

class Car:
    start = [0, 0]
但你忘了在你的问题中包括这一点

然后将class属性指定给
self.start
索引:

self.start[0] = randint(0, len(roads)-1)
self.start[1] = randint(0, len(roads[0])-1)
self.start = tuple(self.start)
这是共享数据,因为这会修改class属性

最后,设置一个实例属性:

self.start[0] = randint(0, len(roads)-1)
self.start[1] = randint(0, len(roads[0])-1)
self.start = tuple(self.start)
包含共享数据。这同样适用于您的
self.finish
属性

您可以通过使用赋值而不是相等性测试来解决此问题:

self.start = [0, roads[0].index('#')]
这同样适用于
self.finish

self.finish == [0, roads[0].index('#')]
您也可以在这里使用一个本地名称,并在构建完列表后仅将其分配给实例属性