Python复制嵌套列表修改副本时改动原变量如何解决?
问题根因
你遇到的副本修改联动原列表的问题,本质是Python中浅拷贝和深拷贝的机制差异导致的。
你最初写的test_puzzle = puzzle根本没有创建副本,只是给原列表绑定了一个新变量名,两个变量指向内存里完全同一个列表对象,不管修改哪一层内容都会同步生效。
后续你尝试的test_puzzle = puzzle[:]、test_puzzle = list(puzzle)、test_puzzle = puzzle.copy()都属于浅拷贝操作:这类操作只会复制最外层的列表对象,列表内部存储的嵌套子列表依然指向原对象的内存地址,所以修改内层子列表的元素时,原列表的对应内容还是会同步变化。
正确解决方案
使用Python标准库copy模块提供的deepcopy()方法创建深拷贝即可。深拷贝会递归遍历所有层级的嵌套对象,生成完全独立的新副本,对副本的任何修改都不会影响原始列表。
正确测试代码:
import copy puzzle = [[1, 2, 3]] test_puzzle = copy.deepcopy(puzzle) test_puzzle[0][1] = 7 print(puzzle) print(test_puzzle)
运行输出:
[[1, 2, 3]] [[1, 7, 3]]
拷贝方式选型参考
- 若列表内所有元素都是不可变类型(数字、字符串、元组),用切片
[:]、list()构造、list.copy()做浅拷贝即可,性能比深拷贝更好 - 若列表存在嵌套可变对象(嵌套列表、字典、自定义可变实例),且需要副本和原对象完全隔离,必须使用
copy.deepcopy()
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

