为什么导入内部函数时会出现UnboundLocalError
Why UnboundLocalError occurs when importing inside function
出于某种原因,此代码产生错误:
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
的本地变量。如果您在创建函数之前尝试在函数中使用局部变量,则会出现该错误。与显式分配变量相同。
同理,如果想在函数内部导入创建全局变量,可以使用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
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
的本地变量。如果您在创建函数之前尝试在函数中使用局部变量,则会出现该错误。与显式分配变量相同。
同理,如果想在函数内部导入创建全局变量,可以使用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
。