嵌套模块上的UnboundLocalError重新导入

时间:2015-12-16 12:16:31

标签: python

当我在python 2.7中重新导入已导入的模块时,我得到一个UnboundLocalError。最小的例子是

#!/usr/bin/python

import sys

def foo():
    print sys
    import sys

foo()

Traceback (most recent call last):
  File "./ptest.py", line 9, in <module>
    foo()
  File "./ptest.py", line 6, in foo
    print sys
UnboundLocalError: local variable 'sys' referenced before assignment

然而,当嵌套导入作为函数定义中的第一个语句放置时,一切正常:

#!/usr/bin/python

import sys

def foo():
    import sys
    print sys

foo()

<module 'sys' (built-in)>

有人可以解释为什么第一个脚本失败了吗? 感谢。

2 个答案:

答案 0 :(得分:0)

这与引用全局变量相同。在Python FAQ

中对此进行了详细解释
  

这是因为当您对作用域中的变量进行赋值时,   该变量变为该范围的局部变量并且类似地影响任何变量   外部范围内的命名变量。自从foo中的最后一个语句   为x分配一个新值,编译器将其识别为本地值   变量。因此,当较早的print(x)尝试打印时   未初始化的局部变量和错误结果。

答案 1 :(得分:0)

这种情况的很难理解的是,当您在合并范围内导入某些内容时,会隐式分配。 (实际上是在这种情况下的重新分配)。

import sys存在于foo中的事实意味着,在foo中,sys并不引用全局sys变量,而是指一个单独的局部变量,也称为sys