关于克隆列表的问题

首先我们看如下代码:

def removeDups(L1,L2):
        '''假设L1,L2是列表,
        删除L2中出现的L1中的元素'''
        for e1 in L1:
                if e1 in L2:
                        L1.remove(e1)

L1 = [1,2,3,4]
L2 = [1,2,5,6]
removeDups(L1,L2)
print('L1=', L1)

这段代码预期运行结果是 L1 = [3,4],但是实际运行结果是L1 = [2,3,4]。因为实际在for循环中,python会内置计数器count跟踪程序在列表中的位置,count每次迭代结束会加一,当计数器的值等于列表当前长度,循环中止。在本例中,程序首先count = 0,发现L1[0]在L2中,于是删除L1[0],count加一,代码会继续检查L1[1]是否在L2中。但是此时L1已经变为[2,3,4],所以L1[1]是3而不是2,所以就不会删除,因此结果就会像上述说的那样。

首先明白列表存储的是什么,列表存储的是对象的引用。这个时候要想实现功能就得把L1元素拷贝下来,也就是克隆。用切片操作进行浅拷贝(后续会进一步说明什么是浅拷贝,深拷贝),把for循环改为for e1 in L1[:] :即可。

在python中不仅仅只有切片可以克隆列表,内置模块copy也可以克隆

具体实现:

import copy #内置模块
def removeDups(L1,L2):
        '''假设L1,L2是列表,
        删除L2中出现的L1中的元素'''
        L3 = copy.deepcopy(L1)   #拷贝L1中元素
        for e1 in L3:
                if e1 in L2:
                        L1.remove(e1)   
'''此时遍历的就是L3列表,再从L3中找出和L2相同元素,对L1中元素进行删除操作。由于L3长度不会变,内置计数器count自增,要删除的元素就会按照预期一样删除了,返回的L1结果集就正确。
用切片克隆的思维类似'''

L1 = [1,2,3,4]
L2 = [1,2,5,6]

removeDups(L1,L2)
print('L1=', L1)

这些是我对克隆的浅浅的理解,具体不懂可以在图上画画操作一下。

本文章为博主原创,未经博主允许不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值