乐趣区

关于python:Python基础教程循环删除的坑

有这样一个列表:lst = [11, 22, 33, 44, 55],当初咱们想要把列表中的每个元素都删除掉,然而不能用 .clear() 办法。

咱们很天经地义地会想到应用 for 循环一一删除:

lst = [11, 22, 33, 44, 55]
for i in lst:
    lst.remove(i)
print(lst)

输入的后果为:[22, 44]

竟然没有删除洁净。

这是 python 中循环的自主计数和列表的主动补位独特影响下的后果。在循环第一圈时,循环操作从索引值为 0 的地位找元素,返回了 11,被胜利删除。当列表删除了 11 之后,前面的元素会主动补位上来,此时,22 的索引变成了 0,33 的索引变成了 1。随后,进入第二圈循环,循环操作会自主把计数加一,开始找索引值为 1 的元素,也就是 33,被胜利删除,而 22,被疏忽掉了。如此一来,所有偶数索引的元素都被删除,奇数索引的元素被保留下来。

为了应答这种循环删除的坑,咱们能够采取两种形式 [1]。

形式一,应用 range 获取字符串长度,管制循环次数,保障可能齐全删除:

lst = [11, 22, 33, 44, 55]
for i in range(len(lst)):
    lst.pop()
print(lst)

形式二,通过复制一个列表,通过循环复制过的列表,管制循环次数:

lst = [11, 22, 33, 44, 55]
for i in lst.copy():
    lst.remove(i)
print(lst)

除了列表之外,字典和汇合也深受循环删除的坑的困扰。与列表不能删除洁净不同的是,字典和汇合在迭代过程中是不能够批改字典的长度的,一旦有批改,就会报错。也就是说,一旦在迭代过程中删除键值对,程序会间接报错:

'''
学习中遇到问题没人解答?小编创立了一个 Python 学习交换 QQ 群:857662006
寻找有气味相投的小伙伴,互帮互助, 群里还有不错的视频学习教程和 PDF 电子书!'''dic = {"key":1,"key2":2}
for i in dic:
    dic.pop(i)
print(dic)

运行后报错:

Traceback (most recent call last):
  File "C:/Users/python.py", line 88, in <module>
    for i in dic:
RuntimeError: dictionary changed size during iteration

同样地,咱们也能够通过复制一份字典,而后通过迭代新的字典来删除原字典中的键值对:

dic = {"key":1,"key2":2}
for i in dic.copy():
    dic.pop(i)
print(dic)

以上就是本次分享的全部内容,当初想要学习编程的小伙伴欢送关注 Python 技术大本营,获取更多技能与教程。

退出移动版