List.append() 使所有元素变为追加的项目

16 投票
2 回答
37597 浏览
提问于 2025-04-16 13:32

我在用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 个回答

0

没错,在Python中使用列表推导式时,你需要用strip来处理数据,不然它会重复替换很多次。

25

我觉得现在的 current 列表只是被复制了好几遍到 past 里。所以你实际上有好几份 相同 的列表。

要解决这个问题:在 def Gen(x,y): 下面两行的 past.append(current) 这一行,把它改成 past.append(current[:])

这里的 list[:] 表示创建一个列表的副本。严格来说,你是在创建整个列表的一个切片。

顺便说一下,更好的解决办法是不要使用全局的 current 变量哦 :)

撰写回答