Python中两层的列表好像有个bug(要么就是我理解有误…)

生成一个矩阵(列表内列表,包括 [[]]),复制内容到另一个变量时,虽然 identity 不同,但是内容更改之后还是会联动

>>> n = 2
>>> M = [[0 for _ in range(n)] for _ in range(n)]
>>> m = list(M)
>>> m
[[0, 0], [0, 0]]
>>> M
[[0, 0], [0, 0]]
>>> m[0][0] = 1
>>> m
[[1, 0], [0, 0]]
>>> M
[[1, 0], [0, 0]]
>>>
>>> id(m)-id(M)
1152

m = list(M) 换成 m = M[:] 或者 m = M.copy() 也没用

不用列表解析式手打也是一样

>>> M=[[1,2],[]]
>>> m = M.copy()
>>> m
[[1, 2], []]
>>> M
[[1, 2], []]
>>> m[0][0] = 3
>>> m
[[3, 2], []]
>>> M
[[3, 2], []]
>>> 
>>> id(m)-id(M)
960

算法作业查了半个小时才查到这有问题……


Python中两层的列表好像有个bug(要么就是我理解有误…)

9 回复

你需要 m=copy.deepcopy(M)


我无法理解你的问题

python<br>In [1]: from copy import deepcopy<br><br>In [2]: m = [[1, 2], []]<br><br>In [3]: M = deepcopy(m)<br><br>In [4]: M<br>Out[4]: [[1, 2], []]<br><br>In [5]: m<br>Out[5]: [[1, 2], []]<br><br>In [6]: m[0][0] = 2<br><br>In [7]: m<br>Out[7]: [[2, 2], []]<br><br>In [8]: M<br>Out[8]: [[1, 2], []]<br><br>In [9]: n = 2<br><br>In [10]: M = [[0 for _ in range(n)] for _ in range(n)]<br><br>In [11]: m = list(M)<br><br>In [12]: id(m[0]) == id(M[0])<br>Out[12]: True<br>

是你理解有问题……这样才是对的。

这样是浅复制,只会复制第一层 list 的元素

外层 list 的 identity 确实不同,但是内层几个对应位置的 list 的 identity 还是一样的 (

感谢,这个好,学习了

回到顶部