You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:22:43