[英]python - why is it possible to use a variable in a function that is declared in the main scope and is not global
[英]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.