后期导入和范围的奇怪行为
weird behaviour of late import and scopes
我刚刚发现 Python 2 和 3 的这种奇怪的作用域行为。当我为子模块添加延迟导入时,顶层模块的主要导入停止工作。可行的例子:
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
有什么想法吗?
导入语句没有什么特别之处。这就是范围界定在 Python 中的工作方式。如果您要为标签分配一个值,除非明确定义为全局,否则它是范围的局部值。
试试这个代码 -
a = 2
def start():
print a
a = 3
start()
这也失败了 UnboundLocalError
作为您的代码,因为语句 a = 3
使标签 a
局部于函数 start
.
我刚刚发现 Python 2 和 3 的这种奇怪的作用域行为。当我为子模块添加延迟导入时,顶层模块的主要导入停止工作。可行的例子:
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
有什么想法吗?
导入语句没有什么特别之处。这就是范围界定在 Python 中的工作方式。如果您要为标签分配一个值,除非明确定义为全局,否则它是范围的局部值。
试试这个代码 -
a = 2
def start():
print a
a = 3
start()
这也失败了 UnboundLocalError
作为您的代码,因为语句 a = 3
使标签 a
局部于函数 start
.