Python 中的无限循环 - 列表是否更新?

用户2300369

首先,我知道我应该使用while循环来创建一个无限循环。尽管如此,在使用forPython进行无限循环时,我遇到了一些我不完全理解的问题。

我对“无限”for循环的想法如下:

l = [1]
for el in l:
  print(len(l))
  l.append(1)

这实际上创建了一个无限循环,因为1l在每次循环迭代时不断附加到列表中。所以我想我不希望我的列表变得越来越长,以至于在某些时候我没有足够的内存。所以我这样做了:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章