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

启用Pandas Copy-on-Write(CoW)后,DataFrame赋值为何不生成新副本?

关于Pandas Copy-on-Write(CoW)的内存地址疑问解答

首先得明确:Pandas官方文档里说的“派生对象始终表现为副本”,不是指立即创建物理内存副本,而是指逻辑上的独立副本行为——这正是CoW(写时复制)的核心设计:延迟复制,只有当修改操作发生时,才会真正生成物理上的独立副本。

为什么赋值后内存地址还相同?

当你执行df1 = df2这种简单变量赋值时,CoW模式下只是给底层的共享数据块多添加了一个引用,并没有立即复制内存。这时候两个DataFrame共享同一块物理内存,但逻辑上是完全独立的——你对其中任意一个做修改操作时,Pandas会自动触发复制,生成新的内存块,此时二者的内存地址才会分离,确保原数据不会被意外修改。

实际测试验证

用代码演示这个过程:

import pandas as pd

# 启用CoW模式
pd.set_option('mode.copy_on_write', True)

# 创建原始DataFrame
df2 = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]})
# 赋值给df1
df1 = df2

# 检查底层数据的内存地址,此时二者共享同一块内存
print(df1._mgr.blocks[0].values.base is df2._mgr.blocks[0].values.base)  # 输出: True

# 修改df1的内容
df1['col1'] = [10, 20, 30]

# 再次检查内存地址,此时已经生成独立副本,地址不同
print(df1._mgr.blocks[0].values.base is df2._mgr.blocks[0].values.base)  # 输出: False

对官方文档描述的正确理解

官方文档里的“表现为副本”,重点在行为表现:无论你是赋值、切片还是其他派生操作,得到的对象在逻辑上都是独立的,修改它不会影响原对象。而物理上的复制只会在必要时(修改操作)才进行,这样既保证了数据安全,又避免了不必要的内存浪费,提升了性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:42:36