List.append () cambiando todos los elementos al elemento adjunto [duplicado]

Esta pregunta ya tiene una respuesta aquí:

¿Por qué foo.append (barra) afecta a todos los elementos en una lista de listas? [duplicar 3 respuestas

Parece que tengo un problema con mi programa generador de laberintos hecho en Python. Estoy tratando de crear al azar una ruta que se ramifica en puntos seleccionados, con los puntos almacenados a medida que avanza. Cuando el laberinto llega a un callejón sin salida, volverá a clasificar los puntos visitados probando el valor más alto que haciendo estallar y yendo al siguiente, hasta que llegue a un punto donde no sea un callejón sin salida. Sin embargo, cuando trato de agregar elementos a la lista que estoy usando para guardar los espacios en los que he estado, sucede algo extraño, nunca lo había visto antes. Aquí está el código, y la mejor manera de verlo es ejecutarlo a través de los tiempos hasta que se complete. Realmente no he encontrado una manera de contrarrestar el problema del callejón sin salida, por lo que si alguien pudiera ayudarme con eso también, sería genial.

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 puede ver, comienza en 0,0 y luego descubre los posibles caminos a seguir. Selecciona aleatoriamente de esos y establece el valor para ese lado de la habitación en 0,0 a 1, lo que significa un pasaje. 2 significa muro y 0 significa fuera de límites. 4 es solo un marcador de posición, ya que todos los valores deben rellenarse para cuando el laberinto esté completamente generado.

Si alguien pudiera ayudarme, sería genial y muy apreciado. Gracias por adelantado

Respuestas a la pregunta(2)

Su respuesta a la pregunta