Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在列表被删除时,for循环在列表的迭代过程中意外停止?_Python_Buffer Overflow - Fatal编程技术网

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

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

问题在于最后一个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 = 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

您有两个选择:

  • 迭代列表副本并删除实际列表
  • 使用
    list.clear
    一步清除列表,而不是for循环
从文档中:

list.clear()
从列表中删除所有项目。相当于删除a[:]


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

您有两个选择:

  • 迭代列表副本并删除实际列表
  • 使用
    list.clear
    一步清除列表,而不是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)
#[]