2015-04-08 2 views
0

Я использую этот код:Python - случайное это на самом деле не случайным

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######### 

находит два 1s и устанавливает их в качестве start и finish, тогда он случайным образом выбирает еще одну переменную. Затем я делаю это:

a = Car() 
b = Car() 

только для того, чтобы узнать, что они оба имеют одинаковое начало и конец, но иногда разные виды. Я не понимаю - если есть проблема со случайным нерабочим, он тоже не должен работать на self.kind!
Как это исправить?

ответ

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.

Вы можете исправить это с помощью задания, а не тест на равенство:

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

и то же самое относится и к self.finish:

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

Вы также можете просто использовать локальное имя здесь и присваивать атрибут экземпляра только после того, как вы закончите создание списков.

2

Вероятно, вы должны изменить ваши задания на это:

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

и это:

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

Прямо сейчас, вы используете оператор сравнения.

Смежные вопросы