2015-04-23 193 views
5

考虑的Python代码下面的代码片段:Python for循环 - 为什么这不是无限循环?

x = 14 
for k in range(x): 
    x += 1 

在执行结束时,x等于28

我的问题:应该不是这个代码循环下去吗?在每次迭代时,它会检查k是否小于x。但是,x在for循环内增加,因此它在下一次比较中具有较高的值。

+0

您正在使用哪个版本的Python? – thefourtheye

回答

9

range(x)不是“命令”。它一次创建一个范围对象,循环遍历它。更改x不会更改使用它创建的所有对象。

>>> x = 2 
>>> k = range(x) 
>>> list(k) 
[0, 1] 
>>> x += 1 
>>> list(k) 
[0, 1] 
6

没有,range(x)将返回与项目的列表[0,1,2,3,4,5,6,7,8,9,10,11,12,13]这些项目将是迭代。每次循环体获得x的值更改评估,但这不会影响已经生成的列表。

换句话说,您将要迭代的集合将只生成一次。

+2

为了迂回,它返回一个Python 2中的列表和一个Python 3中的'range'对象。 – Blair

1

这是因为相比于for蟒蛇for in环有不同的行为(在其他语言): range(x)在每次迭代中不执行,而是在第一时间,然后for in迭代跨越它的元素。 如果要更改代码以运行无限循环,则可以使用while代替(并且在此情况下,范围(x)无意义)。

0

Python中的for loop不是迭代器,而是遍历序列/发生器,即任何形式的iterable

考虑到这一点,除非迭代是无限的,循环不会是无限的。 A sequence不能是无限的,但您可以创建/使用无限生成器。一种可能性是使用itertools.count,它从指定的开始时间开始以指定的时间间隔生成一个不结束的数字序列。

from itertools import count  | for(;;) { 
for i in count(0):     |  //An infinite block 
    #An infinite block    | } 

或者,您也可以随时利用while循环创造一个经典的无限循环

while True: 
    #An infinite block