我是编程新手,但有无法解决的基本问题。我尽可能地简化了它。在此简化版本中,我要遍历一个空列表。我只想将索引存储在“对称矩阵”中:
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
此类列表;但是,将使用相同的列表实例,就像上面更琐碎的示例一样。
PS更准确地说,Python中的所有内容都是对象而不是值,除非对象是不可变的(例如int
s和float
s和str
s等),就好像它们是值并且总是被复制—这是因为如果对象是不可变的,您最好假装对其进行新引用,因为它看起来相同并且无法修改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句