指针改变整个矩阵

时间:2013-11-23 16:41:49

标签: python pointers matrix

我正在尝试创建一个矩阵,但它总是指针......

我希望代码能够将每个单元格设置为自己的单元格,但它会在行中生成彼此指针:

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

3 个答案:

答案 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实际上会以您期望的方式复制所有内容。