Python中为何定义在main外的变量可导入 内部的不可导入?
Python跨模块无法导入函数内部变量的原因
这一问题是Python的作用域规则、模块导入逻辑共同决定的,具体原因如下:
- 模块导入的命名空间规则:使用
from 模块名 import *语法时,只会导入该模块全局命名空间下的对象,也就是直接定义在函数、类之外的顶级代码对象。你示例中的x是script1的全局变量,所以可以正常导入使用。 - 函数局部作用域限制:定义在
main()函数内部的y属于局部变量,它的生命周期仅绑定main()函数的执行周期:只有函数运行时y才会被创建,函数执行结束后就会被销毁,且默认不会对外暴露到模块全局命名空间,自然无法被其他模块导入。 if __name__ == '__main__'的执行限制:script1里的这段判断逻辑,仅在你直接运行script1文件时才会触发。当script1作为模块被导入到script2时,该判断条件不成立,main()函数根本不会执行,y甚至从未被创建过,调用时自然会抛出NameError。
可选解决方案
如果需要获取函数内部的y值,可以选择以下实现方式:
- 直接将
y的定义移到main()函数外,和x一样作为模块全局变量 - 修改
main()函数,将y作为返回值返回,导入后主动调用函数获取值:
# script1 修改后 x = 'this is outside the main script' def main(): y = 'this is inside the main script' return y # script2 调用方式 from script1 import * y = main() print(x) print(y)
- (不推荐,易造成命名空间污染)在
main()函数内使用global y声明,强制将y提升为模块全局变量。
内容的提问来源于stack exchange,提问作者Glen Cripton
相关产品推荐
相关产品推荐

