【问题标题】:Why UnboundLocalError occurs when importing inside function为什么在导入内部函数时会发生 UnboundLocalError
【发布时间】:2020-03-04 03:20:45
【问题描述】:

由于某种原因,此代码会产生错误:

import os

def main():
    print(os.path.isfile('/bin/cat'))
    import os

if __name__ == '__main__':
    main()

结果:

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    main()
  File "test.py", line 5, in main
    print(os.path.isfile('/bin/cat'))
UnboundLocalError: local variable 'os' referenced before assignment

为什么会这样?请注意,在这两种情况的开头都有import os。不知何故,函数体末尾的额外导入会影响该函数的整个范围。

如果您在函数中删除导入,一切都很好(这并不奇怪)。

import os

def main():
    print(os.path.isfile('/bin/cat'))
    # import os

if __name__ == '__main__':
    main()

结果:

True

关于可能的重复:有一些类似的问题,但关于全局变量,而不是导入。

【问题讨论】:

  • 如果您在全局范围内导入 os,您将创建一个名为 os 的全局变量。如果您在本地范围内导入 os,您将创建一个名为 os 的本地变量。如果您在创建函数之前尝试在函数中使用局部变量,则会出现该错误。

标签: python function import local unbound


【解决方案1】:

如果您在全局范围内导入 os,您将创建一个名为 os 的全局变量。如果您在本地范围内导入 os,您将创建一个名为 os 的本地变量。如果您在创建函数之前尝试在函数中使用局部变量,则会出现该错误。就像您明确分配一个变量一样。

同样的解决方案适用,如果你希望函数内部的导入创建一个全局变量,你可以使用global关键字:

def main():
    global os
    print(os.path.isfile('/bin/cat'))
    import os

或者您可以更改本地导入以使用不同的变量名称,这样您对 os 的使用就不会产生歧义。

def main():
    print(os.path.isfile('/bin/cat'))
    import os as _os

虽然这显然只是一个演示示例,在这种情况下,当您已经全局导入 os 时,没有理由在您的函数中重新导入它。

【讨论】:

  • 请注意,我在两个示例的开头都使用了import os。我只是仍然不明白为什么 additional 在下面某处的行中导入会导致函数开头出现错误。
  • 因为如果你在你的函数中创建一个名为 os 的变量(你就是,使用 import os),那么解释器会将函数中对名称 os 的所有引用视为局部变量而不是全局变量。这与关于函数中全局变量使用的所有其他问题完全相同。
  • 好的,所以在函数内部定义变量会影响函数的整个范围,而不仅仅是定义之后的行?如果是这样,那就是我缺乏的东西
  • 既然你的问题是There are some similar questions, but regarding global variables, not imports,我想你可能已经知道那部分了,因为这正是所有这些骗子的目的。
  • 全局变量与导入有点不同。它们共享很多,但是,例如,您不需要在每个函数的开头指定导入,因为您必须使用全局变量。我仍然不知道为什么会这样,但我认为这对另一个问题很重要。
猜你喜欢
  • 2011-03-06
  • 2018-06-29
  • 1970-01-01
  • 2013-02-23
  • 2017-07-12
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多