基于可变对象特性,为何函数内修改DataFrame未同步到外部?
问题解析:为何函数内操作未改变外部的Pandas DataFrame?
已知:
- (A) 在函数中修改可变对象,其变更会体现在调用上下文中
- (B) Pandas DataFrame是可变对象
但如下示例中,函数内的操作并未让外部的DataFrame变成空,这是为什么?
示例代码
import pandas as pd def foo(df): df=df[0:0] # 试图清空df print(df) df=pd.DataFrame([[1,2,3],[4,5,6]]) print("\nOutside - Before:") print(df) print("\nInside function:") foo(df) print("\nOutside - After:") print(df)
输出结果
Outside - Before: 0 1 2 0 1 2 3 1 4 5 6 Inside function: Empty DataFrame Columns: [0, 1, 2] Index: [] Outside - After: 0 1 2 0 1 2 3 1 4 5 6
核心原因:赋值操作≠原地修改可变对象
你混淆了重新赋值局部变量和修改可变对象本身这两个操作:
- 调用
foo(df)时,函数内部的局部变量df最初是指向外部那个DataFrame对象的引用。 df=df[0:0]本质是创建了一个新的空DataFrame对象,然后把函数内部的df变量重新指向了这个新对象。- 原来的外部
df变量依然指向最初的非空DataFrame对象,根本没被修改过。
规则(A)中说的"修改可变对象",指的是直接操作对象内部的数据(原地修改),而非重新赋值变量。
正确的原地修改方式
如果要让外部的DataFrame同步变为空,需要对原对象进行原地修改,比如:
- 使用支持
inplace=True的方法:
def foo(df): df.drop(df.index, inplace=True) # 原地删除所有行 print(df)
- 直接修改DataFrame的内容:
def foo(df): df.iloc[:, :] = [] # 原地清空所有数据 print(df)
这两种方式都是直接修改原DataFrame对象的内部数据,外部的df会同步看到变化。
内容的提问来源于stack exchange,提问作者str31
相关产品推荐
相关产品推荐

