对于python来说也是一样的问题,python代码在执行前首先会被编译成字节码,这就会导致某些时候实际执行的程序会和我们看到的产生出入。不过我们有dis模块帮忙,它可以输出python对象的字节码,下面我们就来看下经过编译后的f:
dis(f)
2 0 LOAD_GLOBAL 0 (print)
2 LOAD_FAST 0 (i)
4 CALL_FUNCTION 1
6 POP_TOP
3 8 LOAD_CONST 1 (‘a’)
10 STORE_FAST 0 (i)
4 12 LOAD_GLOBAL 0 (print)
14 LOAD_FAST 0 (i)
16 CALL_FUNCTION 1
18 POP_TOP
20 LOAD_CONST 0 (None)
22 RETURN_VALUE
其中LOAD_FAST和STORE_FAST
是读取和存储local作用域的变量,我们可以看到,i变成了局部作用域的变量!而对i的赋值早于i的定义,所以报错了。
产生这种现象的原因也很简单,python对函数的代码是独立编译的,如果未加说明而在函数内对一个变量赋值,那么就认为你定义了一个局部变量,从而把外部的同名对象屏蔽了。这么做无可厚非,毕竟python没有独立的声明一个局部变量的语法,但结果就会造成我们看到的类似暂时性死区的现象。所以请允许我把es6的概念套用在python身上。
消除暂时性死区
既然知道问题的症结在于python无法区分局部变量的声明和定义,那么我们就来解决它。
对于一个可以区分声明和定义的语言来说是没有这种烦恼的,比如c:
‘’’
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
‘’’
int i = 0;
void f(void)
{
i++;
printf("%d\n", i); // 1
const char *i = “he