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

如何将Pandas DataFrame传入函数且不修改全局原始版本?

解决Pandas DataFrame函数内操作不修改全局原始版本的问题

这确实容易让人困惑!你遇到的问题其实和Python的可变对象传参机制以及Pandas DataFrame的特性有关,并不是你了解的Python作用域规则出了问题。

先来看你的示例代码:

import pandas as pd

xTest = pd.DataFrame({'A' : ['Test']})
def MyFunction():
    _xTest=xTest
    _xTest['yPred'] = 1
    return _xTest

res=MyFunction()
xTest.head()

运行后全局的xTest被添加了yPred列,原因在于:

  • 当你在函数里写_xTest = xTest时,并没有创建一个新的DataFrame对象,只是让局部变量_xTest指向了和全局xTest同一个DataFrame对象。
  • Pandas的DataFrame是可变对象,对它进行的原地修改(比如添加列、修改值等)会直接作用于原对象本身,不管这个对象是被全局变量还是局部变量引用。

解决方法:创建DataFrame的拷贝

要避免修改全局的原始DataFrame,你需要在函数内创建一个独立的拷贝,这样局部变量操作的就是一个全新的对象,不会影响原数据。具体可以使用Pandas的copy()方法:

修改后的代码示例:

import pandas as pd

xTest = pd.DataFrame({'A' : ['Test']})
def MyFunction():
    _xTest = xTest.copy()  # 创建DataFrame的拷贝
    _xTest['yPred'] = 1
    return _xTest

res=MyFunction()
xTest.head()  # 此时全局的xTest不会包含'yPred'列

关于拷贝的补充说明

  • 默认的copy()是浅拷贝:它会复制DataFrame的结构和顶层数据,但如果DataFrame里包含嵌套的可变对象(比如列表、字典),浅拷贝不会复制这些嵌套对象,修改它们仍会影响原数据。
  • 如果你的DataFrame包含嵌套可变对象,可以使用深拷贝:xTest.copy(deep=True),它会递归复制所有嵌套的可变对象,确保完全独立于原数据。

内容的提问来源于stack exchange,提问作者Reddspark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:42:09