如何复制嵌套列表?实现列表A为列表C的独立副本
如何复制嵌套列表以创建独立副本
问题分析
- 直接赋值
a = c:这只是让变量a指向c的内存地址,两者指向同一个列表对象,修改c的元素时a必然同步变化,无法实现独立副本。 - 使用
c.copy()报错:该方法是Python 3新增的列表方法,若运行环境为Python 2,列表对象没有这个属性,因此会报错。另外即使在Python 3中,copy()属于浅拷贝,仅复制外层列表,嵌套的子列表仍然是引用关系,修改子列表元素时a还是会跟着变。
解决方案
要创建嵌套列表的完全独立副本(深拷贝),有两种可靠方式:
1. 使用copy模块的deepcopy函数
这是最简便的方法,会递归复制所有层级的元素:
import copy b = [["1","1","1"],["1","1","1"],["1","1","1"]] c = [["2","2","2"],["2","2","2"],["2","2","2"]] a = copy.deepcopy(c)
此时修改c的任意元素(包括嵌套子列表的元素),a的内容都不会受影响。
2. 手动实现递归深拷贝
如果不想依赖模块,可以自己写递归函数复制每一层:
def deep_copy_nested_list(lst): new_list = [] for item in lst: # 若当前元素是列表,递归复制;否则直接添加 new_list.append(deep_copy_nested_list(item) if isinstance(item, list) else item) return new_list b = [["1","1","1"],["1","1","1"],["1","1","1"]] c = [["2","2","2"],["2","2","2"],["2","2","2"]] a = deep_copy_nested_list(c)
补充:Python 2中的浅拷贝替代
如果只是需要浅拷贝(不关心嵌套子列表的独立性),在Python 2中可以用以下方式替代copy():
- 切片操作:
a = c[:] - 转换为列表:
a = list(c)
内容的提问来源于stack exchange,提问作者George Smith
相关产品推荐
相关产品推荐

