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

嵌套列表操作疑问:修改临时列表为何影响原列表?

为啥改self.temp会连累原clist?

这事儿的核心是你用的是浅拷贝,不是深拷贝,我给你掰扯明白:

你写的self.temp = list(clist),看起来是复制了一个新列表,但其实只是把原clist里每个嵌套列表的"引用"复制了一份到temp里。说白了,temp里的[-5, -1]和clist里的[-5, -1]根本就是同一个东西,只是有两个不同的名字指着它而已。

  • 第一个循环里,你是从temp里删掉整个嵌套列表项,这时候只是把temp里的"引用"删掉了,clist里的那个引用还在,所以原列表没变化,这部分是正常的。
  • 但到第二个循环,你对temp里的嵌套列表做obj.remove(-number)的时候,相当于直接修改了那个被temp和clist共同指着的嵌套列表,所以clist里的对应内容自然也跟着变了。

给你举个极简的例子感受下:

a = [[1,2], [3,4]]
b = list(a)  # 浅拷贝
b[0].remove(1)
print(a)  # 结果是 [[2], [3,4]],原列表真的被改了!
怎么解决?

你得做深拷贝,也就是把原列表里的所有嵌套元素都复制成全新的对象,这样temp和clist就彻底没关系了。用Python自带的copy模块就行:

先导入模块:

import copy

然后把复制列表的代码改成:

self.temp = copy.deepcopy(clist)

这样之后,再怎么折腾temp里的元素,原clist都不会受影响了。

另外给你提个小优化:第一个循环遍历原列表删temp里的项,其实用列表推导式更简洁还不容易出问题,比如:

# 先过滤掉包含number的项,再深拷贝
self.temp = copy.deepcopy([item for item in clist if number not in item])

这样一步到位,逻辑更清晰~

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:39:20