为什么在列表被删除时,for循环会在列表的迭代过程中意外停止?

2024-10-02 14:22:39 发布

您现在位置:Python中文网/ 问答频道 /正文

问题在于最后一个for循环块。它应该弹出的世博会名单,以完成消失,但它停止在长度32。我无法想象为什么。你知道吗

我试过了列表.pop方法,也如del运算符所示。两者都会产生相同的错误。你知道吗

def generator(): # generator which generates like 2,4,8,16 -> 2 to the power of x
    list = range(1,65)
    for i in list:
        yield 2**i

mygen = generator() # generator object

expo = [] # empty list for the exponential values

for i in mygen: # for loop to put the values of the genertor in list form
    expo.append(i)
    print(expo)

for i in expo: # attempt to delete the last element, but stops at list with length 32
    del expo[-1]
    print(expo)

我希望列表会被删除,因为它是逐步建立。它应该变成[],但是变成len(expo)=32。你知道吗

那为什么会停止呢?你知道吗


Tags: ofthetoin列表forgeneratorlist
2条回答

您正在删除正在迭代的列表,结果只删除了列表的一半,然后迭代在32个元素上停止(因为expo列表的长度是64,它的一半是32

您有两种选择:

  • 迭代列表的副本并删除实际的列表。你知道吗
#Iterating on copy of expo
for i in expo[:]:
    del expo[-1]
    print(expo)
  • 使用list.clear一步清除列表,而不是for循环

从文档:https://docs.python.org/3/tutorial/datastructures.html

list.clear()
Remove all items from the list. Equivalent to del a[:].

expo.clear()
print(expo)
#[]

您不断地删除列表的最后一个元素expo[-1] 因此,当您清除了约一半的列表(32/64个元素)时,就没有更多的值可以迭代了,迭代就停止了。你知道吗

根据经验,在迭代过程中操纵列表通常是个坏主意,因为这种意外行为可能会发生。你知道吗

相关问题 更多 >