导入模块时全局变量作用域问题:跨文件无法访问全局df变量
问题原因与解决方案
为什么拆分文件后无法访问全局变量?
Python里的「全局变量」本质是模块级别的命名空间变量,并非真正跨模块的全局。你在file1的globalDf函数里用global df声明的,是file1这个模块自身的全局变量,和file2的命名空间完全独立。
当你在file2里调用globalDf(arr)时,函数确实给file1模块里的df完成了赋值,但file2自己的命名空间里根本不存在df这个变量,直接print(df)自然会触发NameError。而同一文件时,函数和print共享同一个模块的命名空间,所以能正常访问。
跨文件访问的可行方案
方案1:直接引用模块的变量
既然df属于file1的模块变量,就在file2里明确从file1调用它:
file1(保持不变)
import pandas as pd def globalDf(msg): global df df = pd.DataFrame(msg, columns=['val1', 'val2'])
修改后的file2
import file1 # 导入整个模块 arr = [[100, 400]] file1.globalDf(arr) print(file1.df) # 访问模块内的df变量
也可以用from ... import的方式,注意要在调用函数后重新导入更新后的变量:
from file1 import globalDf arr = [[100, 400]] globalDf(arr) from file1 import df # 重新导入已更新的df print(df)
方案2:让函数返回变量(推荐)
依赖全局变量是不规范的写法,更清晰的方式是让函数直接返回创建好的DataFrame,由调用方自行管理变量:
修改后的file1
import pandas as pd def createDf(msg): return pd.DataFrame(msg, columns=['val1', 'val2'])
修改后的file2
from file1 import createDf arr = [[100, 400]] df = createDf(arr) print(df)
方案3:用共享模块存储全局变量
如果确实需要多个模块共享一个可变变量,可以把它放在单独的模块里,所有需要访问的地方都导入这个模块的变量:
创建shared.py
df = None # 初始化共享变量
修改后的file1
import pandas as pd import shared def globalDf(msg): shared.df = pd.DataFrame(msg, columns=['val1', 'val2'])
修改后的file2
import shared from file1 import globalDf arr = [[100, 400]] globalDf(arr) print(shared.df)
内容的提问来源于stack exchange,提问作者Soma Juice
相关产品推荐
相关产品推荐

