为什么Python的for循环不会重置range()函数的取值范围?
代码运行逻辑解答
你编写的代码如下:
x = 6 for y in range(x): print(y) x -= 2
运行输出0, 1, 2, 3, 4, 5的核心原因非常明确:
核心运行规则
Python的for循环只会在第一次启动前对in关键字后的可迭代对象做一次求值,后续所有循环迭代都只会从已经生成的可迭代对象里依次取值,不会重新计算可迭代对象的内容。
你代码中的range(x)会在x还是初始值6的时候就完成创建,得到固定包含0、1、2、3、4、5六个元素的序列,后续你在循环体内修改x的值,完全不会影响已经生成的range序列,所以循环会完整迭代6次,输出全部6个值。
两个预判的错误点
- 预判输出
0, 0, 0的错误:
你在调试工具里看到指针回到for循环行,只是程序在从已创建的range序列里取下一个元素,不是重新执行range(x)生成新序列。range对象仅创建一次,y会依次取序列的下一个值,不会每次都重置为0。 - 预判输出
0, 1, 2的错误:
range对象的长度在创建时就已经固定,不会因为你后续修改了最初用来生成range的x变量,就动态缩短自身长度。已经生成的range(6)始终有6个元素,会全部迭代完成。
如果想要实现动态根据x的值控制循环终止的效果,应该使用while循环,示例如下:
x = 6 y = 0 while y < x: print(y) x -= 2 y += 1
该段代码会在每次循环前重新判断y < x的条件,实现你预期的动态控制逻辑。
内容的提问来源于stack exchange,提问作者toothpick
相关产品推荐
相关产品推荐

