Python 变量在递归时意外更改? 上下文
我正在尝试Reddit的 其想法是找到解决ASCII迷宫的方法。不幸的是,递归的工作方式与我预期的不同。程序检查是否有空间移动到当前空间的右侧、左侧、下方或上方。如果有,则将空间移动到,并使用新的坐标再次输入该功能。这将一直持续到找到终点 当找到结束时,程序退出。如果发现一个死胡同,那么递归将返回到上一个点,并检查更多的方向,这将一直持续到结束Python 变量在递归时意外更改? 上下文,python,recursion,maze,Python,Recursion,Maze,我正在尝试Reddit的 其想法是找到解决ASCII迷宫的方法。不幸的是,递归的工作方式与我预期的不同。程序检查是否有空间移动到当前空间的右侧、左侧、下方或上方。如果有,则将空间移动到,并使用新的坐标再次输入该功能。这将一直持续到找到终点 当找到结束时,程序退出。如果发现一个死胡同,那么递归将返回到上一个点,并检查更多的方向,这将一直持续到结束 问题 我的程序运行得很好,但是即使在备份递归之后,迷宫也会画出我的线条(用“******”表示)。我不知道如何解释,所以我将使用图像来更好地描述 每
问题 我的程序运行得很好,但是即使在备份递归之后,迷宫也会画出我的线条(用“******”表示)。我不知道如何解释,所以我将使用图像来更好地描述 每种新颜色代表一条新路径。然而,我希望只显示当前的递归路径。例如,在本例中,我只希望显示黄色路径。有人能帮我理解为什么所有的路径都保留下来吗
代码
newMaze=maze
不会复制列表,它只是创建指向同一对象的另一个名称。要复制,您应该在程序顶部import copy
进行复制,然后执行newMaze=copy.deepcopy(maze)
。(您需要一个深度副本,因为maze
是一个列表列表,所以您不仅需要复制外部列表,还需要复制其中的所有列表。)
在Python中,对普通名称的赋值(如
blah=…
)从不复制任何内容。如果你想要一份副本,你必须明确地制作一份。执行此操作的方式取决于您要复制的内容。newMaze=maze
不会复制列表,它只会创建指向同一对象的另一个名称。要复制,您应该在程序顶部导入副本,然后执行newMaze=copy.deepcopy(maze)
。(您需要一个深度副本,因为maze
是一个列表列表,所以您不仅需要复制外部列表,还需要复制其中的所有列表。)
在Python中,对普通名称的赋值(如
blah=…
)从不复制任何内容。如果你想要一份副本,你必须明确地制作一份。方法取决于你复制的内容。你只有一份列表,所以你所有的修改都会永远修改它。谢谢,我想我是用newMaze=maze
行复制列表的。你只有一份列表,所以你所有的修改都会永远修改它。谢谢,我想我用newMaze=maze
一行复制了这个列表?非常感谢。今天我学到了一些新东西。我会尽可能投票回答。再次感谢你的帮助,非常感谢。今天我学到了一些新东西。我会尽可能投票回答。再次感谢你的帮助。
import time
import sys
import os
maze = """\
###############
#S # #
### ### ### # #
# # # # #
# ##### ##### #
# # # #
# ### # ### ###
# # # # # #
# # ### # ### #
# # # # # # #
### # # # # # #
# # # # # #
# ####### # # #
# #E#
###############"""
def displayMaze(maze):
os.system("cls")
display = ""
for x in maze:
for y in x:
display = display + y
display = display + "\n"
print(display)
def findStart(maze):
#Get the maze start co-ords.
for x in range(0,len(maze[0])):
for y in range(0,len(maze)):
if maze[x][y] == "S":
return x,y
def findPath(x,y,maze):
#Look right, left, up and down, If path then move.
time.sleep(0)
if maze[y][x+1] == " ":
newMaze = maze
newMaze[y][x+1] = "*"
displayMaze(newMaze)
findPath(x+1,y,newMaze)
elif maze[y][x+1] == "E":
sys.exit("Done")
if maze[y][x-1] == " ":
newMaze = maze
newMaze[y][x-1] = "*"
displayMaze(newMaze)
findPath(x-1,y,newMaze)
elif maze[y][x-1] == "E":
sys.exit("Done")
if maze[y+1][x] == " ":
newMaze = maze
newMaze[y+1][x] = "*"
displayMaze(newMaze)
findPath(x,y+1,newMaze)
elif maze[y+1][x] == "E":
sys.exit("Done")
if maze[y-1][x] == " ":
newMaze = maze
newMaze[y-1][x] = "*"
displayMaze(newMaze)
findPath(x,y-1,newMaze)
elif maze[y-1][x] == "E":
sys.exit("Done")
if __name__ == "__main__":
maze = maze.split("\n")
newMaze = []
for line in maze:
newMaze.append(list(line))
x,y = findStart(newMaze)
findPath(x,y,newMaze)