Python 对对象副本的更改会改变原始对象
我有一个类,其中有一个DataFrame类型属性。我希望能够使用内置函数对对象执行算术运算,同时保持原始对象不变。不幸的是,这些操作似乎也在改变原始对象。下面是一个例子:Python 对对象副本的更改会改变原始对象,python,pandas,oop,Python,Pandas,Oop,我有一个类,其中有一个DataFrame类型属性。我希望能够使用内置函数对对象执行算术运算,同时保持原始对象不变。不幸的是,这些操作似乎也在改变原始对象。下面是一个例子: import numpy as np import pandas as pd class Container: def __init__(self): self.data = pd.DataFrame() def generate(self): self.data = pd
import numpy as np
import pandas as pd
class Container:
def __init__(self):
self.data = pd.DataFrame()
def generate(self):
self.data = pd.DataFrame(np.random.randint(0,100,size=(100, 1)), columns=['A'])
return self
def __add__(self, other):
copy = self
new = Container()
new.data['A'] = copy.data.eval(f"A + {0}".format(other))
return new
one = Container().generate()
two = one + 1
print(one.data == two.data)
我认为问题在于copy=self
行,但即使使用copy()方法,我似乎也无法保留原始对象
如何确保从原始对象创建新对象时不会更改原始对象?您是否
deepcopy
from copy import deepcopy
dupe=deepcopy(thing)
#now thing and dupe are two separate objects
令人惊讶的是,虽然
copy=self
不是一个拷贝,但您的bug实际上与此无关。我想你根本不需要复印件
您的错误是由于双重格式化字符串造成的:
f"A + {0}".format(other)
f“A+{0}”
是一个f字符串。与格式
不同,它将文本0
作为Python表达式进行计算,并将结果对象的字符串表示形式替换为结果字符串,从而生成“a+0”
。在上调用format
没有任何作用,因为已经没有格式占位符了。你最后打电话来
copy.data.eval("A + 0")
而不是添加您想要添加的内容。
copy=self
不是副本。什么是f“a+{0}”
?打字错误?…嘿,是的,f“A+{0}”。格式(其他)
没有意义。它使用f字符串进行字符串格式化,然后对结果调用format
。这实际上应该失败,因为在f字符串处理之后,format
没有格式占位符了。显然,format
参数被忽略了。我可以发誓,这只发生在关键字参数上。我更新了我的问题以修复打字错误-这个例子是有效的,但打字错误只存在于我上面的复制代码中。由于这仍然发生在原始代码中,我最终通过执行new=copy(self)
和new.data=copy(self.data)
来修复它。次优但功能性很强的回答-我刚刚尝试了copy=deepcopy(self)
,并且one
仍在修改中。我不确定这个问题是否符合打字错误的要求,特别是这个问题是否真的是一个打字错误,是否适合“不太可能帮助未来的读者”,但是我觉得f-string/格式的交互需要一个答案。