You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:25:58