当我想更新矩阵的一个元素(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 :(得分: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]]