我创建了一个简单的函数,根据嵌套列表“迷宫”中的值将 True 或 False 映射到嵌套列表“访问”。我尝试分析它,但无法弄清楚为什么位置 (1,0) 更新为 True,即使位置 (1,0) 没有“=”或“|”值(value)。任何帮助。
def start_matrix(maze):
visited = [[False]*len(maze[0])]*len(maze)
print(visited)
for i in maze:
for k in i:
if k == '=' or k == '|':
print(maze.index(i),i.index(k))
print(visited[maze.index(i)][i.index(k)])
visited[maze.index(i)][i.index(k)] = True
print(visited)
return None
输入
map1 = [['=',' ','|'],[' ',' ',' ']]
start_matrix(map1)
输出:
[[False, False, False], [False, False, False]]
0 0
False
[[True, False, False], [True, False, False]]
0 2
False
[[True, False, True], [True, False, True]]
最佳答案
您的代码问题与 shallow and deep copies 有关。当您分配的代码通过以下方式访问时:
visited = [[False] * len(maze[0])] * len(maze)
它真正做的是首先创建一个 False 列表(这没问题,因为 False 是一种值类型),然后编写该列表的两个副本的脚本。列表是对象,因此结果是一个包含对同一 False 列表的两个引用的列表。然后,当您更改第一个内部列表时,它也会更改第二个列表的值,因为两者是相同的。
解决此问题的方法是使用列表理解来更改访问的构造,以生成内部列表的两个副本:
visited = [[False] * len(maze[0]) for n in range(len(maze))]
那么,完整的代码将是:
def start_matrix(maze):
visited = [[False] * len(maze[0]) for n in range(len(maze))]
print(visited)
for i in maze:
for k in i:
if k == '=' or k == '|':
print(maze.index(i), i.index(k))
print(visited[maze.index(i)][i.index(k)])
visited[maze.index(i)][i.index(k)] = True
print(visited)
return None
map1 = [['=', ' ', '|'], [' ', ' ', ' ']]
start_matrix(map1)
输出为:
[[False, False, False], [False, False, False]]
0 0
False
[[True, False, False], [False, False, False]]
0 2
False
[[True, False, True], [False, False, False]]
希望我说得清楚。如果没有,请告诉我,我会扩展。
关于python - 与嵌套列表混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58570419/