我不明白的地方是,到 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
|  |      1chenstack      2017-08-08 18:19:14 +08:00 因为是在函数中,函数对象构造时会生成 local 变量名表。 比如上述 func,当函数中有 x = 20 时, func.__code__.co_varnames 是 ('x',) 当只有 print(x)时 func.__code__.co_varnames 是 () def 关键字其实就是生成函数对象的 | 
|  |      3chenstack      2017-08-08 18:30:30 +08:00 想深入了解的话可以读一下 python 的源码,其实生成函数对象时已经生成字节码了。__code__里也有很多学问的,另外也有一些内建函数可以手动编译出 code object。 |