循环遍历列表列表

Mit*_*itz 5 python list

我是编程新手,我有一个无法解决的基本问题。我尽可能地简化了它。在此简化版本中,我正在迭代一个空列表。我只想将索引存储在“对称矩阵”中:

n = 2
B = [[None] * n] * n
print B, "\n"
for i in range(n):
    for j in range(n):
        B[i][j] = [i, j]
        print B
Run Code Online (Sandbox Code Playgroud)

最初,该列表如下所示:

[[None, None], [None, None]] 
Run Code Online (Sandbox Code Playgroud)

循环槽后,我希望打印输出为:

[[[0, 0], None], [None, None]]
[[[0, 0], [0, 1]], [None, None]]
[[[1, 0], [0, 1]], [[1, 0], None]]
[[[1, 0], [1, 1]], [[1, 0], [1, 1]]]
Run Code Online (Sandbox Code Playgroud)

相反,我得到这个:

[[[0, 0], None], [[0, 0], None]]
[[[0, 0], [0, 1]], [[0, 0], [0, 1]]]
[[[1, 0], [0, 1]], [[1, 0], [0, 1]]]
[[[1, 0], [1, 1]], [[1, 0], [1, 1]]]
Run Code Online (Sandbox Code Playgroud)

我缺少什么?谢谢你帮忙...

Eri*_*lun 3

您需要的Bn子列表的“新鲜”实例,而不是当前定义的方式:

\n\n
B = [[None] * n for _ in range(n)]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这相当于但比以下内容更短并且(对于 Pythonista)更具可读性:

\n\n
B = []\nfor _ in range(n):\n    B.append([None] * n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是因为 Python 中的列表不是值而是对象;即默认情况下不复制它们。例如:

\n\n
>>> a = []\n>>> b = [a, a]  # list of 2 items, both pointing to the same list instance\n>>> b[0].append(1)  # b[0] refers to the same list instance also referenced by a\n>>> print b\n[[1], [1]]\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而:

\n\n
>>> b = [[], []]  # list of 2 distinct sublists\n>>> b[0].append(1)\n>>> print b\n[[1], []]\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果你将这些知识应用到

\n\n
B = [[None] * n] * n\n
Run Code Online (Sandbox Code Playgroud)\n\n

您将看到构造中存在错误 xe2x80x94您正在创建一个包含另一个n None值列表的列表;然后你“扩大”列表以包含n此类列表;但是,将使用相同的列表实例,就像上面更简单的示例一样。

\n\n

PS更准确地说,Python 中的所有内容都是对象而不是值,除非对象是不可变的,例如ints 和floats 和strs 等,就好像它们是值并且总是被复制\xe2\x80\x94这是因为如果一个对象是不可变的,您不妨假装对它的新引用是它的新副本,因为它看起来相同并且无法修改。

\n