Python 更新列表列表中的值
当我想更新矩阵的一个元素(1,1)时,(0,1)和(1,1)都会更新,为什么会这样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使用相同的对象创建外部数组(通过对相同的
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]]“希望查看更多详细信息的人”建议查看文档,而不是此处。(因为这不是一个权威的来源,它迟早会过时。)恕我直言,我看不出这个答案有多大价值