Python 指针改变整个矩阵

Python 指针改变整个矩阵,python,pointers,matrix,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',

我想制作一个矩阵,但它总是能生成指针

我希望代码使每个单元格都指向自己的单元格,但它会在行中为每个单元格创建指针:

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

这是因为每行上的列表实际上是相同的。当您在中进行修改时

mat[0][0] = "O"
您要修改的列表与所有行上显示的列表相同。您应该使用以下方法创建矩阵:

mat = [["X" for x in range(10)] for y in range (10)]

这是因为无论您指定多少次,
*
操作符都只是重复列表。这不是一个您可能期望的副本,它更像是创建一个引用列表

当您执行类似于
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]]
将以您期望的方式复制所有内容

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