我刚刚发现了Python 2和3的奇怪范围行为。当我为子模块添加后期导入时,toplevel模块的主要导入停止工作。可行的例子:
import os
def start():
import sys
print('in modules?', 'os' in sys.modules)
print('in globals?', 'os' in globals())
print('in locals?', 'os' in locals())
print('os =', os)
import os.path
os.path.exists('useless statement')
start()
输出将是:
in modules? True
in globals? True
in locals? False
Traceback (most recent call last):
File "test.py", line 15, in <module>
start()
File "test.py", line 9, in start
print('os =', os)
UnboundLocalError: local variable 'os' referenced before assignment
有什么想法吗?
答案 0 :(得分:1)
这与import语句没什么特别之处。这就是Python中作用域的工作方式。如果您要为标签分配值,除非明确定义为全局,否则它是范围的本地。
试试这段代码 -
a = 2
def start():
print a
a = 3
start()
这也因代码UnboundLocalError
而失败,因为声明a = 3
使标签a
成为start
的本地。