嵌套列表操作疑问:修改临时列表为何影响原列表?
为啥改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
相关产品推荐
相关产品推荐

