【问题标题】:UnboundLocalError on nested module reimport嵌套模块重新导入时出现 UnboundLocalError
【发布时间】:2015-12-16 12:16:31
【问题描述】:

当我在 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)>

谁能解释一下为什么第一个脚本失败了? 谢谢。

【问题讨论】:

  • 如果您从函数中删除 import sys,那么它也将起作用。由于 foo() 的范围内没有 sys ,它将从全局范围内引用 sys。

标签: python


【解决方案1】:

这与引用全局变量相同。在Python FAQ中有很好的解释

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

【讨论】:

  • 所以赋值定义了整个范围的变量,而不仅仅是那个和后面的行。
【解决方案2】:

这种情况难以理解的是,当您在作用域内导入某些内容时,存在隐式赋值。 (在这种情况下实际上是重新分配)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 2016-09-06
    • 2012-03-07
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多