
我不明白的地方是,到 print 这一行如何知道 x 是 local 还是 global 呢?到这一步还没有分析赋值语句,怎么会当做 local 来对待?
难道是先分析一遍建立符号表,然后再分析一遍进行语法分析?
In [1]: x = 10 In [2]: def func(): ...: print(x) ...: x = 20 ...: In [3]: func() --------------------------------------------------------------------------- UnboundLocalError Traceback (most recent call last) <ipython-input-3-08a2da4138f6> in <module>() ----> 1 func() <ipython-input-2-84a4e5530b9a> in func() 1 def func(): ----> 2 print(x) 3 x = 20 4 UnboundLocalError: local variable 'x' referenced before assignment 1 chenstack 2017 年 8 月 8 日 因为是在函数中,函数对象构造时会生成 local 变量名表。 比如上述 func,当函数中有 x = 20 时, func.__code__.co_varnames 是 ('x',) 当只有 print(x)时 func.__code__.co_varnames 是 () def 关键字其实就是生成函数对象的 |
3 chenstack 2017 年 8 月 8 日 想深入了解的话可以读一下 python 的源码,其实生成函数对象时已经生成字节码了。__code__里也有很多学问的,另外也有一些内建函数可以手动编译出 code object。 |