Python 更新列表列表中的值

Python 更新列表列表中的值,python,Python,当我想更新矩阵的一个元素(1,1)时,(0,1)和(1,1)都会更新,为什么会这样 In [188]: matrix_res = [[0]*2]*2 In [189]: matrix_res Out[189]: [[0, 0], [0, 0]] In [190]: matrix_res[1][1] = 1 In [191]: matrix_res Out[191]: [[0, 1], [0, 1]] 这是因为[0]*2只创建一次。然后,外部*2使用相同的对象创建外部数组(通过对相同的

当我想更新矩阵的一个元素(1,1)时,(0,1)和(1,1)都会更新,为什么会这样

In [188]: matrix_res = [[0]*2]*2

In [189]: matrix_res

Out[189]: [[0, 0], [0, 0]]

In [190]: matrix_res[1][1] = 1

In [191]: matrix_res

Out[191]: [[0, 1], [0, 1]]

这是因为
[0]*2
只创建一次。然后,外部
*2
使用相同的对象创建外部数组(通过对相同的
[0]*2
进行两次引用)

因此,当您修改任何一个时,另一个也将被修改。实际上,它们是同一个对象。

替换此行:

matrix_res = [[0]*2]*2
为此:

matrix_res = [[0 for i in range(2)] for j in range(2)]
或者简单地说:

matrix_res = [[0, 0], [0, 0]]

原因:
matrix\u res=[[0]*2]*2
中,实际上只创建了一个内部列表,
matrix\u res
中的两个子列表都被标记为该列表

谢谢大家。你们都是对的。下面是我从Python文档中获取的信息,供希望了解更多详细信息的人参考:

=========================================================

小于0的n值被视为0(这将产生与s相同类型的空序列)。还要注意的是,副本很浅;嵌套结构不会被复制。这经常困扰着新的Python程序员;考虑:

>>>

>>>列表=[[]]*3

>>>列表 [[],[],[]

>>>列表[0]。追加(3)

>>>列表 [3],[3],[3]]

实际情况是[[]]是一个包含一个空列表的单元素列表,因此[[]]*3的所有三个元素都是(指向)这个空列表。修改列表的任何元素都会修改此单个列表。您可以通过以下方式创建不同列表的列表:

>>>

>>>列表=[]表示范围(3)中的i

>>>列表[0]。追加(3)

>>>列表[1]。追加(5)

>>>列表[2]。追加(7)

>>>列表


[[3]、[5]、[7]]

“希望查看更多详细信息的人”建议查看文档,而不是此处。(因为这不是一个权威的来源,它迟早会过时。)恕我直言,我看不出这个答案有多大价值