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

关于pd.Series.copy()深拷贝行为的疑问:修改副本为何影响原数据?

关于pd.Series.copy()行为的困惑解答

嘿,这个问题我当初刚接触pandas的时候也踩过坑,确实容易搞混!咱们一点点拆解清楚:

核心问题:Series.copy()的默认拷贝逻辑

你可能误解了资料里说的“深拷贝”——pandas里的Series.copy()默认参数是deep=True,但这个“深拷贝”是针对Series自身的数据结构而言的,并不是对Series里所有嵌套元素都做完全的深拷贝。

具体来说:

  • 如果Series的元素是不可变对象(比如int、str、float),copy(deep=True)会创建完全独立的副本,修改副本不会影响原Series。
  • 但如果元素是可变的Python对象(比如列表、字典),哪怕用deep=True,pandas也只会复制这些对象的引用,而不是创建对象本身的深拷贝。这就导致原Series和副本里的可变元素指向同一个内存对象。

你的代码为什么返回True?

看你的代码:

for i, row in df.iterrows():
    q = row.copy()
    q.col.append(['foo'])
    return row.col == q.col

这里的row是从iterrows()拿到的Series,q = row.copy()做的是浅拷贝(针对里面的列表元素来说)。也就是说q.col和row.col指向的是同一个列表对象。当你给q.col添加元素时,实际上是修改了这个共享的列表,所以row.col和q.col自然完全相等,返回True。

怎么实现真正的完全独立拷贝?

如果想要让副本里的可变元素也完全独立,需要使用Python标准库的copy.deepcopy(),它会递归地拷贝所有嵌套的可变对象:

import pandas as pd
import copy

# 示例DataFrame
df = pd.DataFrame({'col': [[1, 2], [3, 4]]})

for i, row in df.iterrows():
    q = copy.deepcopy(row)
    q.col.append('foo')
    print(row.col == q.col)  # 现在会返回False

关键总结

  • pandas的Series.copy()优先保证Series结构的独立,但不会深度拷贝嵌套的Python可变对象。
  • 处理包含可变元素的Series时,要用copy.deepcopy()才能得到完全隔离的副本。

内容的提问来源于stack exchange,提问作者Intelligent-Infrastructure

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:29:51