Python 为什么在列表被删除时,for循环在列表的迭代过程中意外停止?
问题在于最后一个for循环块。它应该弹出世博会名单,以完成消失,但它停止在长度32。我无法想象为什么 我尝试了list.pop方法,也尝试了del操作符。两者都会引起相同的错误Python 为什么在列表被删除时,for循环在列表的迭代过程中意外停止?,python,buffer-overflow,Python,Buffer Overflow,问题在于最后一个for循环块。它应该弹出世博会名单,以完成消失,但它停止在长度32。我无法想象为什么 我尝试了list.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 = genera
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
那么它为什么会停止呢?您不断删除列表中的最后一个元素
expo[-1]
因此,当您清除了约一半的列表(32/64个元素)时,就没有更多的值可以迭代,迭代就停止了
根据经验,在迭代过程中操纵列表通常不是一个好主意,因为这种意外行为可能会发生。您不断删除列表的最后一个元素
expo[-1]
因此,当您清除了约一半的列表(32/64个元素)时,就没有更多的值可以迭代,迭代就停止了
根据经验,在迭代过程中操纵列表通常不是一个好主意,因为这种意外行为可能会发生。您正在删除正在迭代的列表,结果只删除了一半列表,然后迭代在32个元素上停止(由于
expo
列表的长度是64
,因此其中一半是32
您有两个选择:
- 迭代列表副本并删除实际列表
- 使用
一步清除列表,而不是for循环list.clear
从列表中删除所有项目。相当于删除a[:]
您正在删除正在迭代的列表,结果只删除了列表的一半,然后迭代在32个元素上停止(因为
expo
列表的长度是64
,其中一半是32
您有两个选择:
- 迭代列表副本并删除实际列表
- 使用
一步清除列表,而不是for循环list.clear
从列表中删除所有项目。相当于删除a[:]
expo[:]的可能副本是否创建了副本?是的,它创建了副本,在python中称为切片,尽管您不需要这种方法,但您只需按照我的第二个选项在@MaxRandom一步清除列表:)非常感谢你,我非常感谢你的时间和帮助!嗨@MaxRandom我看到你接受了我的答案,然后又不接受我的答案,你能告诉我答案中是否有遗漏。我可以修复:)世博会[:]创建副本?是的,确实如此,在python中称为切片,尽管您不需要这种方法,但您只需按照我的第二个选项@MaxRandom一步清除列表即可:)非常感谢您,我非常感谢您的时间和帮助!您好@MaxRandom我看到您接受了我的答案,然后又拒绝了我的答案,您能告诉我答案中是否缺少一些内容吗。我可以解决它:)
#Iterating on copy of expo
for i in expo[:]:
del expo[-1]
print(expo)
expo.clear()
print(expo)
#[]