gpt4 book ai didi

python - copy 和 deepcopy 正在改变对象类型

转载 作者:太空宇宙 更新时间:2023-11-03 20:30:58 25 4
gpt4 key购买 nike

我有以下示例:

import pandas as pd
from copy import copy, deepcopy

class DataFrameWrapper(pd.DataFrame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

def __eq__(self, other):
return self.equals(other)


t1 = DataFrameWrapper(pd.DataFrame({'a': [1, 2, 3]}))
t2 = deepcopy(t1)
t3 = copy(t1)

print(type(t1), ' ', type(t2), ' ', type(t3))

输出:

<class 'DataFrameWrapper'>   <class 'pandas.core.frame.DataFrame'>   <class 'pandas.core.frame.DataFrame'>

有人能告诉我为什么 copy 和 deepcopy 会修改 t1 的类型吗?

DataFrameWrapper 类的目的只是允许我在 pandas DataFrame 之间执行 ==

最佳答案

发生这种情况是因为 pandas 中已重新定义复制功能以返回基本类型。为了您的目的,您可以这样做:

class DataFrameWrapper(pd.DataFrame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

def __eq__(self, other):
return self.equals(other)

def __copy__(self):
return DataFrameWrapper(super().__copy__())

def __deepcopy__(self, memo=None):
return DataFrameWrapper(super().__deepcopy__(memo))

或者

t1 = DataFrameWrapper(pd.DataFrame({'a': [1, 2, 3]}))
t2 = DataFrameWrapper(deepcopy(t1))
t3 = DataFrameWrapper(copy(t1))

您可以引用How to override the copy/deepcopy operations for a Python object?查看定义 __copy__() 和 __deepcopy()__ 的工作原理,与 pandas/core/generic.py 中的 pandas 库内的操作相同

为了测试上述理论(并用 pandas 重现行为),这里有一个测试代码:

from copy import copy, deepcopy

class Base:
def __copy__(self):
return Base()

def __deepcopy__(self, memodict={}):
return Base()


class Inherited(Base):
pass


B = Base()
I = Inherited()
I_copy = copy(I)
I_deepcopy = deepcopy(I)

print('Type B :', type(B))
print('Type I :', type(I))
print('Type I_copy :', type(I_copy))
print('Type I_deepcopy :', type(I_deepcopy))

哪些输出:

Type B : <class '__main__.Base'>
Type I : <class '__main__.Inherited'>
Type I_copy : <class '__main__.Base'>
Type I_deepcopy : <class '__main__.Base'>

关于python - copy 和 deepcopy 正在改变对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57512344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com