Python跨文件调用函数时如何访问函数内部的diag变量?
问题原因分析
- 你遇到的
NameError本质是局部变量作用域隔离导致的:diag是fc1函数的内部局部变量,默认函数执行完成后局部变量就会被销毁,外部作用域(包括另一个文件的全局作用域)无法直接访问。 - 你设置全局变量未生效的原因有两个:
- 没有在
fc1内部用global关键字声明diag,Python会默认把它识别为局部变量,不会写入模块全局作用域 - 不同Python文件的全局作用域是相互隔离的,就算你在File1中把
diag设为全局变量,也不能直接在File2中裸写diag访问,需要通过File1模块对象或者主动导入这个变量。
- 没有在
- 额外的问题:你已经在
fc1中通过return语句返回了diag的值,但是在File2中调用fc1时没有用变量接收返回值,这也是你拿不到结果的直接原因。
解决方案
方案1:接收函数返回值(最推荐,无副作用)
Python函数的返回值可以直接被调用方接收赋值,这是跨作用域传递值的最规范方式,不需要修改File1的代码,只需要调整File2的调用逻辑即可:
# File2.py 修改后代码 from File1 import fc1 S1 = [a,b,c,d] S2 = [a,b,d] # 调用函数并用变量接收返回的diag值 diag = fc1(S1,S2) print(diag)
方案2:通过模块全局变量传递(不推荐,易产生变量污染)
如果有特殊场景必须用全局变量存储,可以按如下方式修改:
- 首先修改File1的
fc1函数,添加global声明,把diag写入File1的全局作用域:
# File1.py 修改后代码 S1 = [a,b,c,d,e] S2 = [a,b,d,e] def fc1(S1,S2): global diag # 声明diag为全局变量 diag = S1 + S2 return(diag)
- 在File2中通过File1模块访问全局的
diag变量,注意必须先调用fc1完成diag的赋值后再访问:
# File2.py 修改后代码 import File1 S1 = [a,b,c,d] S2 = [a,b,d] File1.fc1(S1,S2) # 通过模块名访问File1的全局变量diag print(File1.diag)
内容的提问来源于stack exchange,提问作者Chr_8580
相关产品推荐
相关产品推荐

