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

Pandas 1.5.3浅拷贝疑问:为何df['A']=[...]无法更新副本?

Pandas 1.5.3浅拷贝同步差异问题解析

先看问题中的示例代码:

import pandas as pd

df = pd.DataFrame({
    'A': [1,1, 1],
    'B': [2,2, 2]
})
df2 = df.copy(False)  # 浅拷贝
df['A'] = [10,10,10]

实际结果中df2的'A'列仍为[1,1,1],但预期是同步更新为[10,10,10];而执行以下操作时,df2能正常同步:

  1. df['A'] += [10,10,10]
  2. 修改单个值:df['A'][0] = 10

核心原因:浅拷贝共享「列对象引用」,而非强制绑定列的指向

Pandas的浅拷贝(deep=False)本质是:创建一个新的DataFrame外壳,但共享原DataFrame中各列的Series对象引用。不同操作对原DataFrame的影响不同,导致拷贝对象是否同步:

  • df['A'] = [10,10,10]:替换列引用,而非修改原列内容
    这个操作是给df的'A'列重新赋值了一个全新的Series对象,相当于把df里'A'的指向从旧Series换成了新Series。而df2的'A'列依然指向原来的旧Series,自然看不到新值。

  • df['A'] += [10,10,10]:原地修改原Series内容
    +=属于原地(in-place)操作,它不会创建新的Series,而是直接修改原Series内部的数值。因为df2的'A'列和df的'A'列共享同一个Series引用,所以修改后df2会同步看到变化。

  • df['A'][0] = 10:直接修改原Series的元素
    这种操作是直接定位到原Series的某个元素并修改值,同样属于原地修改原Series的内容,共享引用的df2自然会同步更新。

简单总结:浅拷贝只保证共享现有列的内容,但当你给原DataFrame的列「换了个新对象」时,拷贝对象不会自动跟着换引用;只有当你修改「原有列对象内部的内容」时,拷贝才会同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:52:53