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

时间:2019-04-11 15:09:36

标签: python python-3.x loops for-loop infinite-loop

首先,我知道我应该使用while循环来创建一个无限循环。但是,在使用Python进行无限for循环时,我碰到了一些我不太了解的东西。

我对“ 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?

2 个答案:

答案 0 :(得分:1)

如果您按照上述建议使用iterator,则可以更轻松地实现。
下面的类实现了迭代器类所需的___iter______next___方法

class WhileLoop:

    def __init__(self, value):
        #Assign the value
        self.value = value

    def __iter__(self):
        #The iterator will be the class itself
        return self

    def __next__(self):
        #The next element in the loop is the value itself
        return self.value

然后可以按如下所示在此迭代器上调用并循环。

loop = WhileLoop(1)
for item in loop:
    print(item)

答案 1 :(得分:1)

for statement返回一个“迭代器”,它是一个数据流的容器,该数据流一次返回一个元素,因此您无需遍历可迭代对象(在这种情况下,您的列表),而是遍历此对象容器。

您可以直接使用 Scan your string, If not inside tag, find first and second quotation marks, replace accordingly, continue scanning from the second quotation marks Else continue to end of tag 返回此迭代器,以便更好地了解for循环的情况。

iter()

内置的items = ['a'] it = iter(items) print(it.__reduce__()) # (<built-in function iter>, (['a'],), 0) 函数返回有关迭代器的状态信息。请注意,在创建迭代器后立即返回的状态信息包括可迭代的__reduce__()和索引值['a']。索引值指示迭代器将返回的下一个元素的位置。

要模拟循环的第一次迭代,我们可以使用0,它从迭代器返回下一个元素。

next()

现在我们看到索引值已更改为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

如果您真的对创建无限for循环感兴趣,那么使用生成器将是处理内存问题的更好方法(尽管正如您在问题中所指出的,没有太多不使用{ {1}})。参见my answer to a related question for an example of an infinite for loop