更新列表列表中的值

时间:2014-02-24 07:58:23

标签: 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]]

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

替换此行:

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_res = [[0]*2]*2实际上只创建了一个内部列表,matrix_res中的两个子列表都标记为只有一个。

答案 2 :(得分:0)

谢谢所有人。你们都是对的。以下是我从Python文档中获取的信息,供那些想要查看更多详细信息的人使用:

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

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

>>>

>>> lists = [[]] * 3

>>>名单 [[],[],[]]

>>>列表[0] .append(3)

>>>名单 [[3],[3],[3]]

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

>>>

>>> list = [[] for i in range(3)]

>>>列表[0] .append(3)

>>>列表[1] .append(5)

>>>列表[2] .append(7)

>>>列表

[[3],[5],[7]]