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

时间:2015-06-12 19:08:24

标签: python python-3.x cpython

我刚刚发现了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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这与import语句没什么特别之处。这就是Python中作用域的工作方式。如果您要为标签分配值,除非明确定义为全局,否则它是范围的本地。

试试这段代码 -

a = 2

def start():
    print a

    a = 3

start()

这也因代码UnboundLocalError而失败,因为声明a = 3使标签a成为start的本地。