我正在尝试创建一个矩阵,但它总是指针......
我希望代码能够将每个单元格设置为自己的单元格,但它会在行中生成彼此指针:
mat = [ ["X"]*10 ]*10
for line in mat:
print line
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
mat[0][0] = "O"
for line in mat:
print line
['O', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['O', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['O', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['O', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['O', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['O', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['O', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['O', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['O', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['O', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
答案 0 :(得分:2)
mat = [['X'] * 10 for _ in range(10)]
答案 1 :(得分:2)
那是因为每行的列表实际上是相同的。在
中进行修改时mat[0][0] = "O"
您正在修改的列表与所有行上显示的列表相同。您应该使用以下内容创建矩阵:
mat = [["X" for x in range(10)] for y in range (10)]
答案 2 :(得分:1)
这是因为*
运算符只是重复列表,但是多次指定。这不是您所期望的副本,它更像是创建引用列表。
当您执行b = [a]*2
之类的操作时,您获得的结果实际为[[a[0],a[1],...],[a[0],a[1],...]]
,因此此处a
的所有更改都会更改b
。
例如:
>>>> a = [1, 2, 3]
>>>> b = [a]*3
>>>> b
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>>> a[0] = 999
>>>> b
[[999, 2, 3], [999, 2, 3], [999, 2, 3]]
要使用您使用的语法,您必须告诉python复制列表。
>>>> from copy import deepcopy
>>>> a = [1, 2, 3]
>>>> b = deepcopy([a]*3)
>>>> b
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>>> a[0] = 999
>>>> b
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
deepcopy实际上会以您期望的方式复制所有内容。