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

2017-02-26 15:19:41 +08:00
 Yvette

生成一个矩阵(列表内列表,包括 [[]]),复制内容到另一个变量时,虽然 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

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

2005 次点击
所在节点    Python
8 条回复
trnhoe
2017-02-26 15:34:34 +08:00
你需要 m=copy.deepcopy(M)
xiahei
2017-02-26 15:35:15 +08:00
```python
In [1]: from copy import deepcopy

In [2]: m = [[1, 2], []]

In [3]: M = deepcopy(m)

In [4]: M
Out[4]: [[1, 2], []]

In [5]: m
Out[5]: [[1, 2], []]

In [6]: m[0][0] = 2

In [7]: m
Out[7]: [[2, 2], []]

In [8]: M
Out[8]: [[1, 2], []]

In [9]: n = 2

In [10]: M = [[0 for _ in range(n)] for _ in range(n)]

In [11]: m = list(M)

In [12]: id(m[0]) == id(M[0])
Out[12]: True
```
ligyxy
2017-02-26 15:36:38 +08:00
kindjeff
2017-02-26 16:10:55 +08:00
是你理解有问题……这样才是对的。
argsno
2017-02-26 16:15:23 +08:00
这样是浅复制,只会复制第一层 list 的元素
Yinz
2017-02-26 19:04:07 +08:00
外层 list 的 identity 确实不同,但是内层几个对应位置的 list 的 identity 还是一样的 (
cszhiyue
2017-02-27 11:27:04 +08:00
Yvette
2017-02-27 11:48:19 +08:00
@cszhiyue 感谢,这个好,学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/343277

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX