以下是python代码,我使用operator *初始化2-d列表,并将对角元素设置为其他值。但得到意想不到的输出。
table = [([False]*5)]*5
for i in range(5):
table[i][i] = 1
预期输出
[[True, False, False, False, False],
[False, True, False, False, False],
[False, False, True, False, False],
[False, False, False, True, False],
[False, False, False, False, True]]
但我得到了
[[True, True, True, True, True],
[True, True, True, True, True],
[True, True, True, True, True],
[True, True, True, True, True],
[True, True, True, True, True]]
我想,列表中的元素可能会引用一个元素。如何在不使用numpy或其他软件包的情况下获得预期的输出?
答案 0 :(得分:2)
通过嵌套table
循环在for
构造中明确指出,否则列表中的指针都将指向单个列表。这就是为什么在您的代码中,分配一个元素会影响所有元素。
table = [[False for i in range(5)] for j in range(5)]
for i in range(5):
table[i][i] = True
# [[True, False, False, False, False],
# [False, True, False, False, False],
# [False, False, True, False, False],
# [False, False, False, True, False],
# [False, False, False, False, True]]
如果您乐意使用第三方库,更好的想法是使用numpy
:
import numpy as np
table = np.eye(5).astype(bool)
# array([[ True, False, False, False, False],
# [False, True, False, False, False],
# [False, False, True, False, False],
# [False, False, False, True, False],
# [False, False, False, False, True]], dtype=bool)