重复2d列表中的元素,同时更改一个值?

时间:2018-04-09 11:03:24

标签: python arrays python-3.x list

以下是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或其他软件包的情况下获得预期的输出?

1 个答案:

答案 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)