python - 与嵌套列表混淆

标签 python list nested

我创建了一个简单的函数,根据嵌套列表“迷宫”中的值将 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/

相关文章:

python - TextCtrl 的 wxPython C++ 部分被删除

java - 替代嵌套循环进行比较

sql - 子查询作为嵌套 SQL 列表的元素

python - 是否有一个简单的单行代码来访问 Python 中嵌套字典的每个元素?

python - 在 python 中合并列表

Python 3 Bokeh Heatmap 矩形简单示例未在图中显示任何内容

python - C代码嵌入python回调函数

python - 无法让 SSL 在 Tornado 上工作

python - 通过返回迭代器而不是列表来保存 Py3k 内存

list - 删除重复项但保留顺序