当我在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)>
有人可以解释为什么第一个脚本失败了吗? 感谢。
答案 0 :(得分:0)
这与引用全局变量相同。在Python FAQ
中对此进行了详细解释这是因为当您对作用域中的变量进行赋值时, 该变量变为该范围的局部变量并且类似地影响任何变量 外部范围内的命名变量。自从foo中的最后一个语句 为x分配一个新值,编译器将其识别为本地值 变量。因此,当较早的print(x)尝试打印时 未初始化的局部变量和错误结果。
答案 1 :(得分:0)
这种情况的很难理解的是,当您在合并范围内导入某些内容时,会隐式分配。 (实际上是在这种情况下的重新分配)。
import sys
存在于foo
中的事实意味着,在foo
中,sys
并不引用全局sys
变量,而是指一个单独的局部变量,也称为sys
。