Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对对象副本的更改会改变原始对象_Python_Pandas_Oop - Fatal编程技术网

Python 对对象副本的更改会改变原始对象

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

我有一个类,其中有一个DataFrame类型属性。我希望能够使用内置函数对对象执行算术运算,同时保持原始对象不变。不幸的是,这些操作似乎也在改变原始对象。下面是一个例子:

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/格式的交互需要一个答案。