生成一个矩阵(列表内列表,包括 [[]]),复制内容到另一个变量时,虽然 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
算法作业查了半个小时才查到这有问题……
1
trnhoe 2017-02-26 15:34:34 +08:00 via Android 1
你需要 m=copy.deepcopy(M)
|
2
xiahei 2017-02-26 15:35:15 +08:00 1
```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 ``` |
3
ligyxy 2017-02-26 15:36:38 +08:00 via Android 2
|
4
kindjeff 2017-02-26 16:10:55 +08:00 1
是你理解有问题……这样才是对的。
|
5
argsno 2017-02-26 16:15:23 +08:00 via Android 1
这样是浅复制,只会复制第一层 list 的元素
|
6
Yinz 2017-02-26 19:04:07 +08:00
外层 list 的 identity 确实不同,但是内层几个对应位置的 list 的 identity 还是一样的 (
|
7
cszhiyue 2017-02-27 11:27:04 +08:00 1
|