Python函数主代码内正常,导入functions.py后失效的解决办法
问题原因
你在主模块里定义update_df时,Python函数是调用阶段才查找变量,所以即便df在函数定义后声明,调用时主模块作用域里已经有df,函数能找到并修改。但把函数移到functions.py后,函数的作用域属于functions模块,调用时它会在自己的模块里找df,自然找不到主模块里的变量,所以报错。
解决方案
1. 把df作为参数传入函数(最推荐)
这是Python里最规范的写法,彻底解耦模块依赖,代码更清晰易维护:
functions.py里修改函数:
def update_df(df): df['x'] = df['y']
- 主代码里调用时直接传入df:
import pandas as pd from functions import update_df df = pd.DataFrame({'y': [1,2,3]}) update_df(df)
2. 显式引用主模块的变量(不推荐,耦合性高)
如果非要让函数直接访问主模块的df,可以在functions.py里导入主模块(假设主文件叫main.py):
functions.py:
import main def update_df(): main.df['x'] = main.df['y']
但这种写法会让两个模块互相依赖,后续修改主模块文件名或变量名时容易出问题,不建议用。
为什么from functions import *没用?
import *只是把functions.py里的函数、变量复制到主模块的命名空间,但函数本身的作用域还是属于functions模块,函数内部查找变量的逻辑不会变,所以还是找不到主模块的df。
内容的提问来源于stack exchange,提问作者StephanT
相关产品推荐
相关产品推荐

