python - 循环遍历列表列表

标签 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

最初,列表如下所示:

[[None, None], [None, None]] 

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

[[[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]]]

相反,我得到了这个:

[[[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]]]

我错过了什么?感谢您的帮助...

最佳答案

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

B = [[None] * n for _ in range(n)]

这等同于但比以下更短且(对于 Pythonista)更具可读性:

B = []
for _ in range(n):
    B.append([None] * n)

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

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

鉴于:

>>> b = [[], []]  # list of 2 distinct sublists
>>> b[0].append(1)
>>> print b
[[1], []]

如果您将这些知识应用到

B = [[None] * n] * n

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

P.S. 更准确地说,Python 中的一切都是对象而不是值,除非对象是不可变的,例如 intfloats 和 strs 等,就好像它们是值并且总是被复制——这是因为如果一个对象是不可变的,你不妨假装对它的新引用是一个新的它的副本,因为它看起来相同且无法修改。

关于python - 循环遍历列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19450186/

相关文章:

C++禁止在将结构传递给函数时声明...没有类型错误

java - 就地过滤 Java 列表,无需外部库

python - 在单独的 .kv (Kivy) 文件中定义的屏幕之间切换

python - 当灯具具有相同参数时如何使用间接参数化?

python - 如何绕过python中特定站点的DDOS攻击检查?

android - 如何将 <Spanned> 放入 list.setAdapter?

python - 如何创建键: column_name and value : unique values in column in python from a dataframe的字典

python - 如何同时从列表中删除多个索引?

python - 如何将 Bloomberg API 中的数据存储到 Pandas 数据框中?

python - Matplotlib 中的 MonthLocator