Python循环运行机制问询:两类典型代码的原理解析
Python 问题解答
问题1:生成器表达式j for i in range(5)的运行逻辑
生成器表达式是延迟计算的,只有在迭代它的时候才会逐个生成值,而且表达式里的变量采用后期绑定——也就是迭代时才去读取变量的当前值,不是定义生成器时就把值固定下来。
- 对于
x1=(j for i in range(5))迭代出五个4的情况:
这里的j是外部变量(或与循环变量i关联,但生成器不会缓存循环过程中j的每一次值)。当你迭代x1时,for i in range(5)的循环已经执行完毕,此时i的最终值是4(range(5)的最后一个元素是4),如果j最终被赋值为这个4,那每次迭代生成器都会读取当前j的数值4,因此会生成五个4。 - 当把
j替换为i时:
此时生成器里的i就是循环自身的变量,迭代生成器时,i会依次遍历range(5)的每一个元素(0、1、2、3、4),每次迭代都会取当前循环到的i值,因此会生成对应的序列。
问题2:循环代码的运行机制
先看代码:
a = [0, 1, 2, 3] for a[-1] in a: print(a[-1])
输出结果为0、1、2、2,原因拆解如下:
这段代码的核心是循环的目标变量是列表的最后一个元素,而且列表迭代器是按索引顺序访问元素,迭代过程中列表的最后一位会被每次取出的元素修改。
具体执行步骤:
- 初始列表
a = [0,1,2,3],循环启动时创建a的迭代器,会按索引0→1→2→3依次访问列表元素。 - 第一次循环:取出
a[0]的值0,赋值给a[-1](即a[3]),此时a变为[0,1,2,0],打印a[-1]→ 0。 - 第二次循环:取出
a[1]的值1,赋值给a[3],a变为[0,1,2,1],打印1。 - 第三次循环:取出
a[2]的值2,赋值给a[3],a变为[0,1,2,2],打印2。 - 第四次循环:取出
a[3]的值2,赋值给a[3](列表无变化),打印2。
因此最终输出为0、1、2、2。
内容的提问来源于stack exchange,提问作者dadi007
相关产品推荐
相关产品推荐

