Python列表复制问题求助:修改副本时原列表被意外改动
嵌套列表拷贝踩坑?看这篇就够了
兄弟,你遇到的是Python里浅拷贝 vs 深拷贝的经典坑!你的islands是嵌套列表(列表里套列表),而你用的copy.copy()、切片[:]、直接循环追加元素这些方法,全都是浅拷贝——它们只会复制外层的列表容器,但里面的子列表(比如['a','b','c'])其实还是和原列表共享同一个内存引用。
举个直白的例子:你相当于复制了一个文件夹的快捷方式,打开快捷方式里的文件修改,原文件夹里的文件自然也会跟着变。
解决方法有两种,任你选:
方法1:用copy.deepcopy()(最省心)
这个方法会递归复制所有嵌套的元素,生成一个完全独立的新列表,和原列表彻底断绝关系:
import copy islands=[['a','b','c'],[]] def transfer(thing): new_islands = copy.deepcopy(islands) # 换成深拷贝 new_islands[0].remove(thing) return new_islands transfer('b') print(islands) # 现在输出 [['a', 'b', 'c'], []],原列表完全不受影响
方法2:手动实现深拷贝(不用第三方模块)
如果不想导入copy模块,可以用列表推导式,遍历外层列表的同时,逐个复制里面的子列表:
islands=[['a','b','c'],[]] def transfer(thing): # 对每个子列表做切片拷贝,生成全新的嵌套列表 new_islands = [sub_list[:] for sub_list in islands] new_islands[0].remove(thing) return new_islands transfer('b') print(islands) # 同样输出 [['a', 'b', 'c'], []]
补充:为啥你之前的循环追加没用?
如果你之前的循环是这么写的:
new_islands = [] for item in islands: new_islands.append(item) # 这里只是把子列表的引用加进去了!
那和浅拷贝没区别,得改成这样才对:
new_islands = [] for item in islands: new_islands.append(item[:]) # 复制子列表的内容,不是引用
内容的提问来源于stack exchange,提问作者Badmephisto
相关产品推荐
相关产品推荐

