鱼C论坛

 找回密码
 立即注册
查看: 1234|回复: 3

[已解决]关于深度拷贝问题

[复制链接]
发表于 2020-9-27 09:55:38 | 显示全部楼层 |阅读模式
1鱼币
list1 = [1, 1, 1, 2, 2, 3, 4, 4, 3, 3, 5, 5, 5, 4, 4]
L1 = len(list1)   #列表list1的长度
list2 = copy.deepcopy(list1)
count = 0
for i in range(L1):
    for j in range(len(list2)):
        if (list1[i] == list2[j]):
            count += 1
            if count > 2:
                del(list2[j])
print(list2)

为什么报错提示 if (list1[i] == list2[j]):

IndexError: list index out of range

求大哥指点
最佳答案
2020-9-27 09:55:39
这不是深度拷贝的问题,是因为你在for循环内修改了你要遍历的序列,导致下标溢出
你的内层循环 j 取值为0~14,但是在循环内你修改了list2,使得list2长度小于15了,这样,当你下标较大的时候,就会报错说下标溢出。
两种方法解决问题
第一种,倒序遍历,这样删除的话,也不影响该元素前面的元素的下标
第二种,for遍历list2浅拷贝,而不是遍历下标

你这悬赏还不如不悬赏呢。。。不悬赏,最佳得到的奖励比你这个多多了

最佳答案

查看完整内容

这不是深度拷贝的问题,是因为你在for循环内修改了你要遍历的序列,导致下标溢出 你的内层循环 j 取值为0~14,但是在循环内你修改了list2,使得list2长度小于15了,这样,当你下标较大的时候,就会报错说下标溢出。 两种方法解决问题 第一种,倒序遍历,这样删除的话,也不影响该元素前面的元素的下标 第二种,for遍历list2浅拷贝,而不是遍历下标 你这悬赏还不如不悬赏呢。。。不悬赏,最佳得到的奖励比你这个多多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-27 09:55:39 | 显示全部楼层    本楼为最佳答案   
这不是深度拷贝的问题,是因为你在for循环内修改了你要遍历的序列,导致下标溢出
你的内层循环 j 取值为0~14,但是在循环内你修改了list2,使得list2长度小于15了,这样,当你下标较大的时候,就会报错说下标溢出。
两种方法解决问题
第一种,倒序遍历,这样删除的话,也不影响该元素前面的元素的下标
第二种,for遍历list2浅拷贝,而不是遍历下标

你这悬赏还不如不悬赏呢。。。不悬赏,最佳得到的奖励比你这个多多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-27 10:16:37 From FishC Mobile | 显示全部楼层
你要明白range(len(list2))不是每循环一次就计算一次的,它只在首次循环的时候执行,也就是下标范围已经是固定的了,但你在循环中又修改了列表list2导致长度变短,所以下标就超出范围了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-27 10:33:03 | 显示全部楼层
ls1 = [0,1,2]
for item in range(len(ls1)):
    if item == 1: 
        del ls1[1]
    print(ls1[item])


# 迭代器初始化后不变
# 删除生成迭代器本身的函数会出out of range

第1次循环:迭代器[0,1,2],使用序号0;循环完成后ls1内容[0,1,2]。
第2次循环:迭代器[0,1,2],使用序号1;循环完成后ls1内容[0,2]。
第3次循环:迭代器[0,1,2],使用序号2;ls1已没有ls1[2]的元素,报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 13:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表