首先我们看如下代码:
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)
这些是我对克隆的浅浅的理解,具体不懂可以在图上画画操作一下。
本文章为博主原创,未经博主允许不得转载。