List.append () alterando todos os elementos para o item anexado [duplicado]

Esta pergunta já tem uma resposta aqui:

Por que foo.append (bar) afeta todos os elementos em uma lista de listas? [duplicado 3 respostas

Parece que tenho um problema com o meu programa de geração de labirinto feito em Python. Estou tentando criar aleatoriamente um caminho que se ramifica em pontos selecionados, com os pontos sendo armazenados à medida que avança. Quando o labirinto chega a um beco sem saída, ele classifica de volta os pontos visitados testando o valor mais alto do que saltando e indo para o próximo, até chegar a um ponto em que não é um beco sem saída. No entanto, quando tento anexar itens à lista que estou usando para salvar os espaços em que estive, algo estranho acontece, nunca o vi antes. Aqui está o código, e a melhor maneira de vê-lo é executá-lo várias vezes até que ele passe por todo o caminho. Eu realmente não encontrei uma maneira de combater o problema do beco sem saída, por isso, se alguém pudesse me ajudar com isso também, seria ótim

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

Como você pode ver, começa em 0,0 e depois descobre os caminhos possíveis a seguir. Ele seleciona aleatoriamente e define o valor para esse lado da sala em 0,0 a 1, o que significa uma passagem. 2 significa parede e 0 significa fora dos limites. 4 é apenas um espaço reservado, pois todos os valores devem ser preenchidos quando o labirinto for completamente gerad

Se alguém pudesse me ajudar, isso seria ótimo e muito apreciado. Desde já, obrigado

questionAnswers(2)

yourAnswerToTheQuestion