Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在导入函数内部时发生UnboundLocalError_Python_Function_Import_Local_Unbound - Fatal编程技术网

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

Python 为什么在导入函数内部时发生UnboundLocalError,python,function,import,local,unbound,Python,Function,Import,Local,Unbound,由于某些原因,此代码会产生错误: 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

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

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

True
结果:

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

True

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

如果在全局范围内导入操作系统,则创建一个名为
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
的全局变量。如果在本地范围内导入操作系统,则创建一个名为
os
的本地变量。如果在函数创建之前尝试在函数中使用局部变量,就会出现错误。请注意,在这两个示例中,我都在开始时导入操作系统。我仍然不明白为什么下面某行中的额外导入会导致函数开头出现错误。因为如果您在函数中创建一个名为
os
的变量(使用
import os
),则,然后,解释器将函数中对名称
os
的所有引用视为局部变量,而不是全局变量。这与函数中使用全局变量的所有其他问题完全相同。那么,在函数中定义变量会影响函数的整个范围,而不仅仅是定义后的行?如果是这样的话,那就是我所缺少的,因为你的问题是,有一些类似的问题,但是关于全局变量,而不是导入的问题,我想你可能已经知道了这一部分,因为这正是所有那些重复的内容。全局变量与导入有点不同。它们共享很多,但是,例如,您不需要像处理全局变量那样在每个函数的开头指定导入。我仍然不知道为什么会这样,但我认为这是另一个问题的材料。