1

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

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

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

4

1 回答 1

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尽管显然这只是一个演示示例,在这种情况下,当您已经全局导入函数时,没有理由在函数内部重新导入。

于 2019-11-07T14:10:16.263 回答