后期导入和范围的奇怪行为

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.