由于某些原因,此代码会产生错误:
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
关于可能的重复项:存在一些类似的问题,但是关于全局变量,而不是导入。
答案 0 :(得分: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
的情况下在函数中重新导入。{p>