为什么在函数内部导入时发生UnboundLocalError

问题描述 投票:0回答: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,一切都很好(这不足为奇)。

import os

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

if __name__ == '__main__':
    main()

结果:

True

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

python function import local unbound
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的情况下将其重新导入函数中。

© www.soinside.com 2019 - 2024. All rights reserved.