首先,我知道我应该使用while
循环来创建一个无限循环。尽管如此,在使用for
Python进行无限循环时,我遇到了一些我不完全理解的问题。
我对“无限”for
循环的想法如下:
l = [1]
for el in l:
print(len(l))
l.append(1)
这实际上创建了一个无限循环,因为1
它l
在每次循环迭代时不断附加到列表中。所以我想我不希望我的列表变得越来越长,以至于在某些时候我没有足够的内存。所以我这样做了:
l = [1]
for el in l:
print(len(l))
l.pop(0)
l.append(1)
我只有一次迭代。有人可以解释为什么吗?是不是因为l
仍然引用同一个对象并且其长度始终为1?
该for语句返回一个“迭代”,这是对数据流的容器,在每次返回一个元素,这样你就不会遍历迭代(在这种情况下,您的列表),而是在这个容器中。
您可以直接使用返回此迭代器iter()
,以便更好地了解 for 循环发生的情况。
items = ['a']
it = iter(items)
print(it.__reduce__())
# (<built-in function iter>, (['a'],), 0)
内置__reduce__()
函数返回有关迭代器的状态信息。请注意,迭代器创建后立即返回的状态信息包括可迭代的['a']
和 的索引值0
。索引值指示迭代器将返回的下一个元素的位置。
为了模拟循环的第一次迭代,我们可以使用next()
which 从迭代器返回下一个元素。
next(it)
print(it.__reduce__())
# (<built-in function iter>, (['a'],), 1)
现在我们看到索引值已更改为 ,1
因为迭代器已经返回列表中的第一个元素,并且在下一次迭代中它将尝试返回列表中的第二个元素。如果您尝试删除列表中的第一个元素,然后将另一个元素附加到列表中,以下是迭代器的结果状态。
items.pop(0)
items.append('b')
print(it.__reduce__())
# (<built-in function iter>, (['b'],), 1)
您可以看到第一个元素被删除,新元素被追加(如预期的那样)。然而,迭代器仍然保留了一个索引值1
作为下一个迭代返回的元素的位置。如果我们尝试另一次迭代,StopIteration
则会引发异常,因为1
我们的迭代器容器正在使用的可迭代对象中的 index 处没有元素。
next(it)
# Traceback (most recent call last):
# File "main.py", line 16, in <module>
# next(it)
# StopIteration
如果您真的对创建无限 for 循环感兴趣,那么使用生成器将是处理您的内存问题的更好方法(尽管正如您在问题中指出的那样,没有太多充分的理由不使用while
此类事物)。有关无限循环的示例,请参阅我对相关问题的回答。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句