Python函数内无法更新外部DataFrame变量的问题求助
问题排查:函数无法更新全局DataFrame变量
问题根源
你的代码里,create_latest函数内的created_df = df并没有修改全局的created_df,而是在函数内部创建了一个同名的局部变量。Python默认会把函数内赋值的变量当作局部变量,除非你显式声明它是全局变量。
解决方案
有两种可行的修复方式,推荐第二种(更符合Python代码规范):
方案1:使用global关键字声明全局变量
在create_latest函数开头添加global created_df,明确告诉函数要操作的是全局作用域的created_df:
import os import pandas as pd dir_path = "#path of directory " dfs_dict = {} created_df = pd.DataFrame(columns=[column names]) def create_latest(): global created_df # 声明要操作全局变量 dfs_dict.clear() folders = [f for f in os.listdir(dir_path) if os.path.isdir(os.path.join(dir_path, f))] for folder in folders: dfs_dict[folder] = transform(folder) # transform function returns a dataframe df = pd.concat(dfs_dict.values(), axis=1) created_df = df # 此时会修改全局变量 def run(): if created_df.empty: create_latest() run()
方案2:让函数返回DataFrame,在调用处赋值(推荐)
避免直接操作全局变量,改为让create_latest返回处理后的DataFrame,在run函数里给全局created_df赋值:
import os import pandas as pd dir_path = "#path of directory " dfs_dict = {} created_df = pd.DataFrame(columns=[column names]) def create_latest(): dfs_dict.clear() folders = [f for f in os.listdir(dir_path) if os.path.isdir(os.path.join(dir_path, f))] for folder in folders: dfs_dict[folder] = transform(folder) # transform function returns a dataframe return pd.concat(dfs_dict.values(), axis=1) def run(): global created_df # 声明要修改全局变量 if created_df.empty: created_df = create_latest() run()
补充说明
第二种方案更推荐,因为过度依赖全局变量会让代码逻辑变得混乱,难以追踪变量的修改路径,也不利于函数的复用和测试。
内容的提问来源于stack exchange,提问作者MONEET
相关产品推荐
相关产品推荐

