Python基础循环代码疑问:两种实现方式的差异解析
两段Python循环代码的输出差异解析
问题背景
任务要求从标准输入读取整数n,打印所有小于n的非负整数的平方值(即0², 1², ..., (n-1)²)。以下两段代码执行结果不同,我们来拆解背后的逻辑。
初始代码(倒序输出)
n = int(input()) for i in range(n): print(n * n) n = n - 1
执行逻辑(以输入n=3为例)
- 初始输入n=3,
range(n)在循环启动前就生成了序列[0,1,2],因此循环会执行3次。 - 第一次循环:i=0,此时外部变量n仍为3,打印
3*3=9,随后n被修改为2。 - 第二次循环:i=1,外部变量n为2,打印
2*2=4,随后n被修改为1。 - 第三次循环:i=2,外部变量n为1,打印
1*1=1,随后n被修改为0。 - 最终输出:9、4、1(倒序)。
核心问题:这段代码完全没用到循环变量i,反而不断修改外部的n,打印的是递减中的n的平方,而非0到n-1的平方。
修正后代码(正序输出)
n = int(input()) for n in range(n): print(n * n) n = n - 1
执行逻辑(以输入n=3为例)
- 初始输入n=3,
range(n)同样在循环启动前生成序列[0,1,2],循环执行3次。 - 第一次循环:循环变量n被赋值为序列的第一个元素0,打印
0*0=0,随后将n修改为-1,但这个修改不会影响下一次迭代。 - 第二次循环:循环变量n会被强制赋值为序列的下一个元素1,打印
1*1=1,随后修改为0,同样不影响后续迭代。 - 第三次循环:循环变量n被赋值为序列的第三个元素2,打印
2*2=4,随后修改为1。 - 最终输出:0、1、4(符合预期)。
关键逻辑:Python的for循环会预先生成迭代序列,每次迭代时循环变量会被序列的下一个值覆盖,因此内部修改循环变量n不会改变迭代的顺序。这段代码本质上是用n作为循环变量,直接取range序列中的值计算平方,虽然内部有n = n -1的操作,但完全不影响循环的迭代流程。
更优写法
为了避免变量覆盖导致的混淆,更清晰的写法是直接使用独立的循环变量:
n = int(input()) for i in range(n): print(i * i)
这段代码直接遍历0到n-1的整数,打印每个数的平方,逻辑清晰且不易出错。
内容的提问来源于stack exchange,提问作者MEAVAEM
相关产品推荐
相关产品推荐

