List.append() изменяет все элементы на добавляемый элемент
Кажется, у меня проблема с моей программой создания лабиринтов, созданной на Python. Я пытаюсь случайным образом создать путь, который разветвляется в выбранных точках, с сохранением точек по мере их продвижения. Когда лабиринт попадает в тупик, он будет перебирать посещенные точки, проверяя верхнее значение, затем выталкивая его и переходя к следующему, пока не доберется до точки, где он не является тупиком. Однако, когда я пытаюсь добавить элементы в список, который я использую, чтобы сохранить места, в которых я был, происходит что-то странное, на самом деле, я никогда раньше этого не видел. Вот код, и лучший способ увидеть его - это запустить его через несколько раз, пока он не пройдет весь путь до конца. Я действительно не нашел способа противостоять тупиковой проблеме, поэтому, если кто-то мог бы помочь мне и с этим, это было бы здорово.
import random
width = 8
def check(x,y):
"""Figures out the directions that Gen can move while"""
if x-1 == -1:
maze[x][y][3] = 0
if x+1 == 8:
maze[x][y][1] = 0
if y+1 == 8:
maze[x][y][2] = 0
if y-1 == -1:
maze[x][y][0] = 0
if x + 1 in range(0,8) and visited[x+1][y] == False:
maze[x][y][1] = 2
if x - 1 in range(0,8) and visited[x-1][y] == False:
maze[x][y][3] = 2
if y + 1 in range(0,8) and visited[x][y+1] == False:
maze[x][y][2] = 2
if y - 1 in range(0,8) and visited[x][y-1] == False:
maze[x][y][0] = 2
def Gen(x,y):
visited[x][y] = True
past.append(current)
dirs = []
check(x,y)
print current
if maze[x][y][0] == 2:
dirs.append(0)
if maze[x][y][1] == 2:
dirs.append(1)
if maze[x][y][2] == 2:
dirs.append(2)
if maze[x][y][3] == 2:
dirs.append(3)
pos = random.choice(dirs)
print dirs
maze[x][y][pos] = 1
if pos == 0:
current[1] -= 1
if pos == 1:
current[0] += 1
if pos == 2:
current[1] += 1
if pos == 3:
current[0] -= 1
if maze[x][y][0] == 4:
maze[x][y][0] = 1
if maze[x][y][1] == 4:
maze[x][y][1] = 1
if maze[x][y][2] == 4:
maze[x][y][2] = 1
if maze[x][y][3] == 4:
maze[x][y][3] = 1
print maze[x][y]
print past, '\n'
#Build the initial values for the maze to be replaced later
maze = []
current = [0,0]
visited = []
past = []
#Generate empty 2d list with a value for each of the xy coordinates
for i in range(0,width):
maze.append([])
for q in range(0, width):
maze[i].append([])
for n in range(0, 4):
maze[i][q].append(4)
#Makes a list of falses for all the non visited places
for x in range(0, width):
visited.append([])
for y in range(0, width):
visited[x].append(False)
#Generates the walls
#for q in range(0, width):
# for i in range(0, width):
# check(q, i)
current = [0,0]
while current != [7,7]:
Gen(current[0], current[1])
print maze
Как видите, он начинается с 0,0, а затем выясняет возможные пути. Он случайным образом выбирает из них и устанавливает значение для этой стороны комнаты от 0,0 до 1, что означает проход. 2 означает стену, а 0 означает выход за пределы. 4 - это просто заполнитель, так как все значения должны быть заполнены к тому времени, когда лабиринт будет полностью создан.
Если бы кто-нибудь мог мне помочь, это было бы здорово и очень ценилось. Заранее спасибо.
2 ответа
Я верю current
список просто копируется несколько раз в past
, Таким образом, у вас есть несколько копий одного и того же списка.
Исправить: в линии past.append(current)
(две строки ниже def Gen(x,y):
), измените его на past.append(current[:])
,
Запись list[:]
создает копию списка. Технически вы создаете часть всего списка.
Кстати, лучшим решением было бы не использовать глобальный current
переменная:)
Да, это правильно, в то время как список понимания в Python вам нужно добавить полоской, иначе он будет заменен несколько раз