for循环不会在python中无限制

时间:2017-05-25 04:15:44

标签: python

为什么这个for循环不是无限的,这里循环一个列表并重新定义循环内的列表

a = [1,2,3,4,5,6,7,8,9]
for i in a:
    print i
    a = [1,2,3,4,5,6,7,8,9]
output : 1,2,3,4,5,6,7,8,9

4 个答案:

答案 0 :(得分:3)

粗略地说,循环不是无限的,因为i绑定的迭代器在代码执行到达for . . . in循环时被绑定。之后,所有后续调用都是iter.next(),这会将现有迭代器移动到下一个位置,而不管后续重新定义a

回想一下,数组有一个名为__iter__(或iter)的内置函数。然后,您的for循环等同于:

a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(a)
try:
    while True:
        print next(it) # for compatibility you may want to use next(it)
        a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
except StopIteration:
    pass

请注意,在上面的等效代码中,对a的任何更改都不会影响i,因为i已经绑定到遍历第一个[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]的迭代器。

您可以通过更改a

的第一个值来观察此情况
a = [ 1, 2, 3, 4 ]
for i in a:
    print i
    a = [ 5, 4, 3, 2, 1 ]

请注意a = [ 5, 4, 3, 2, 1 ]不会从第一行更改[ 1, 2, 3, 4 ]的存在,因为该数组已存在于内存中。后续调用每个都分配一个新数组并将其分配给a

答案 1 :(得分:1)

由于a未被修改(您只是将其设置为相同的值),for循环按预期进行。您期望的是for循环在重新分配a时重新启动,但这不会发生。

相反,要使其无限,请尝试:

a = [1,2,3,4,5,6,7,8,9]
for i in a:
    print i
    a.append(i)

答案 2 :(得分:0)

我不知道,为什么你需要这个,但这可能对你有帮助

a = [1,2,3,4,5,6,7,8,9]
for i in a:
    print i
    a.append(10) #or anything else-))

use this tool查看代码中发生的情况。

答案 3 :(得分:0)

您甚至不仅可以修改列表的内容,还可以修改变量的值,并且您将获得相同的结果。

a = [1,2,3,4,5,6,7,8,9]
for i in a:
    print i
    a = "Hello World!"

for中加载了值,因此不会考虑循环内的任何修改。