求助,为什么这两段代码的输出结果是不同的?

2019-01-11 20:10:24 +08:00
 ladypxy

首先,这样的 2 段代码

for i in range(1,10):
    for j in range(0,i):
        print(2**j,end=" ")
    print("")
print("\n")

for i in range(1, 10):
    for i in range(0, i, 1):
        print(2**i,end=" ")
    print("")
print("\n")

输出均为

1 
1 2 
1 2 4 
1 2 4 8 
1 2 4 8 16 
1 2 4 8 16 32 
1 2 4 8 16 32 64 
1 2 4 8 16 32 64 128 
1 2 4 8 16 32 64 128 256 

然后倒序输出

for i in range(1,10):
    for i in range(-1+i,-1,-1):
        print(2**i,end=" ")
    print("")
print("\n")


for i in range(1, 10):
    for k in range(-1 + i, -1, -1):
        print(2**k,end=" ")
    print("")
print("\n")

输出结果都是

1 
2 1 
4 2 1 
8 4 2 1 
16 8 4 2 1 
32 16 8 4 2 1 
64 32 16 8 4 2 1 
128 64 32 16 8 4 2 1 
256 128 64 32 16 8 4 2 1 

但是结合到一起

for i in range(1,10):
    for j in range(0,i):
        print(2**j,end=" ")
    for k in range(-1+i,-1,-1):
        print(2**k,end=" ")
    print("")
print("\n")

for i in range(1, 10):
    for i in range(0, i, 1):
        print(2**i,end=" ")
    for i in range(-1 + i, -1, -1):
        print(2**i,end=" ")
    print("")
print("\n")

结果就变成了

1 1 
1 2 2 1 
1 2 4 4 2 1 
1 2 4 8 8 4 2 1 
1 2 4 8 16 16 8 4 2 1 
1 2 4 8 16 32 32 16 8 4 2 1 
1 2 4 8 16 32 64 64 32 16 8 4 2 1 
1 2 4 8 16 32 64 128 128 64 32 16 8 4 2 1 
1 2 4 8 16 32 64 128 256 256 128 64 32 16 8 4 2 1 


1 
1 2 1 
1 2 4 2 1 
1 2 4 8 4 2 1 
1 2 4 8 16 8 4 2 1 
1 2 4 8 16 32 16 8 4 2 1 
1 2 4 8 16 32 64 32 16 8 4 2 1 
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1 
1 2 4 8 16 32 64 128 256 128 64 32 16 8 4 2 1
2030 次点击
所在节点    Python
4 条回复
ClutchBear
2019-01-11 20:44:17 +08:00
外层循环的变量是 i
内层循环的变量也是 i
pright
2019-01-11 20:57:00 +08:00
执行第一个 loop
for i in range(0, i, 1):
之后 i 的值变成了 i-1

所以第二个 loop
for i in range(-1 + i, -1, -1)
的-1 + i 的值就错了
ladypxy
2019-01-11 21:14:31 +08:00
@pright 多谢,明白了。就是外循环的变量 i,在内循环开始时,其实就相当于常量,也就是内循环的 i 和外循环的 i 不是同一个变量。 而 2 个内循环的 2 个 i,其实是同一个变量。这样理解对吧
pright
2019-01-11 21:46:16 +08:00
所有的 i 都是同一个变量,关键其实是外层 loop 执行时 i 的值会被改写回来,要解释的话应该是
外层 loop
for i in range(1, 10)
生成一个[1, 2, ..., 9]的 list,依次给 i 赋值,假设执行到 i=2,往下执行。
第一层 loop
for i in range(0, i, 1)
先解析 range(0, i, 1),此时 i 的值是外层 loop 传下来的 i 的值 2,之后生成了一个[0, 1]的 list,list 中的每个元素都会给 i 赋值,改变 i 的值,直到 loop 完,此时 i 的值为 1。
第二层 loop
for i in range(-1 + i, -1, -1)
同样解析 range(-1 + i, -1, -1),此时 i 的值是刚刚得到的 1,所以生成了一个[0]的 list,给 i 赋值
之后回到外层 loop,list 继续给 i 赋值成 3,继续运行。

官方说明
https://docs.python.org/dev/reference/compound_stmts.html#for
The for-loop makes assignments to the variables in the target list. This overwrites all previous assignments to those variables including those made in the suite of the for-loop:
for i in range(10):
print(i)
i = 5 # this will not affect the for-loop
# because i will be overwritten with the next
# index in the range

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/526186

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX