python for循环变量作用域_for循环中python变量的作用域

与C代码类似

你在想象你在python中的for-loop是这样的C代码:for (int i = 0; i < 10; i++)

if (i == 5)

i += 3;

更像是C代码:int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

for (int j = 0; j < sizeof(r)/sizeof(r[0]); j++) {

int i = r[j];

if (i == 5)

i += 3;

}

因此,在循环中修改i不会产生预期的效果。

反汇编示例>>> from dis import dis

>>> def foo():

... for i in range (0,10):

... if i==5:

... i+=3

... print i

...

>>> dis(foo)

2 0 SETUP_LOOP 53 (to 56)

3 LOAD_GLOBAL 0 (range)

6 LOAD_CONST 1 (0)

9 LOAD_CONST 2 (10)

12 CALL_FUNCTION 2

15 GET_ITER

>> 16 FOR_ITER 36 (to 55)

19 STORE_FAST 0 (i)

3 22 LOAD_FAST 0 (i)

25 LOAD_CONST 3 (5)

28 COMPARE_OP 2 (==)

31 POP_JUMP_IF_FALSE 47

4 34 LOAD_FAST 0 (i)

37 LOAD_CONST 4 (3)

40 INPLACE_ADD

41 STORE_FAST 0 (i)

44 JUMP_FORWARD 0 (to 47)

5 >> 47 LOAD_FAST 0 (i)

50 PRINT_ITEM

51 PRINT_NEWLINE

52 JUMP_ABSOLUTE 16

>> 55 POP_BLOCK

>> 56 LOAD_CONST 0 (None)

59 RETURN_VALUE

>>>3 LOAD_GLOBAL 0 (range)

6 LOAD_CONST 1 (0)

9 LOAD_CONST 2 (10)

12 CALL_FUNCTION 2

此时,堆栈的顶部包含范围。15 GET_ITER

此时,堆栈的顶部包含一个已实现范围上的迭代器。>> 16 FOR_ITER 36 (to 55)

此时,堆栈顶部包含迭代器的下一个值。19 STORE_FAST 0 (i)

因此无论您在循环中做什么,都将覆盖i。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值