繁体   English   中英

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

[英]Why can a python function use a variable in the global scope before it's defined?

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

if __name__ == '__main__':
  A = [12]
  print A 
  foo(10)

foo如何知道A

我之所以这样写,是因为stackoverflow坚持要写更多的单词。

检查生成的字节码:

>>> 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

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

A是全局变量。 您可能会认为它对于if __name__ == '__main__'块是局部的,但是if语句未在Python中创建单独的命名空间 当执行foo (未定义)时,变量A存在于全局名称空间中,因此您当前的代码运行没有任何问题。

如果要查看预期的行为,请将所有内容从该块移动到函数中,然后从if __name__ == '__main__'块中调用该函数:

def foo(i):
  print len(A)      # A is local to main(), so this will raise an exception
  return i < len(A)

def main():
  A = [12]
  print A 
  foo(10)

if __name__ == '__main__':
  main()

因为A是在全局范围内定义的,并且直到被调用才在函数中查找。

是同样的原因

def should_fail():
   print undefined_variable

print "runs OK!"

运行正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM