Python中修改嵌套列表的copy()副本为何会同步影响其他副本?
异常原因
问题出在Python列表的copy()是浅拷贝:它只会复制最外层的列表对象,不会复制内层嵌套的子列表,你生成的coords、distances和原grid共享同一套内层行列表。
具体逻辑:
- 你通过
np.empty((10,0)).tolist()得到的grid,是一个外层长度为10的列表,里面装了10个空列表作为二维网格的行。 - 调用
.copy()时,只是给coords和distances新建了独立的外层列表壳,但壳子里存的10个行列表的内存地址,和原grid里存的行地址完全一样——换句话说grid[i]、coords[i]、distances[i]三个变量指向的是同一个列表对象。 - 你在循环里交替往
distances[i]追加距离值、往coords[i]追加坐标,本质是往同一个列表里先后塞两种数据,最后每个行列表里都混了距离和坐标,所以不管打印哪个变量,出来的都是数字和坐标对交替出现的错误结果。
你之前打印三个变量的id发现地址不同,只能证明三个外层列表是独立对象,说明不了内层子列表的关系。你可以打印id(grid[0])、id(coords[0])、id(distances[0])验证,这三个地址是完全相同的。
修正方案
不用从同一个grid做浅拷贝派生两个列表,直接分别初始化两个独立的嵌套空列表就行:
import numpy as np coords = [[] for _ in range(10)] distances = [[] for _ in range(10)] for i in range(10): for j in range(10): distances[i].append(i+j) coords[i].append([i, j]) print(distances) print(coords)
如果一定要用拷贝实现,需要用标准库的copy.deepcopy()做深拷贝,但这个场景下直接初始化更简单,性能也更好。
内容的提问来源于stack exchange,提问作者shadow_integration
相关产品推荐
相关产品推荐

