为什么python函数在定义之前可以在全局范围内使用变量?

Pra*_*are 1 python

def foo(i):
  print len(A)
  return i < len(A)

if __name__ == '__main__':
  A = [12]
  print A 
  foo(10)
Run Code Online (Sandbox Code Playgroud)

怎么foo知道A

我写这篇是因为stackoverflow坚持我写了更多的单词.

JBe*_*rdo 5

检查生成的字节码:

>>> dis.dis(foo)
  2           0 LOAD_GLOBAL              0 (print) 
              3 LOAD_GLOBAL              1 (len) 
              6 LOAD_GLOBAL              2 (A) 
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair) 
             12 CALL_FUNCTION            1 (1 positional, 0 keyword pair) 
             15 POP_TOP              

  3          16 LOAD_FAST                0 (i) 
             19 LOAD_GLOBAL              1 (len) 
             22 LOAD_GLOBAL              2 (A) 
             25 CALL_FUNCTION            1 (1 positional, 0 keyword pair) 
             28 COMPARE_OP               0 (<) 
             31 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

要加载A变量,它使用LOAD_GLOBAL操作码.因此,当函数运行(而不是定义)时,它将在全局命名空间中搜索此变量