对对象变异原始对象的更改

时间:2018-02-14 22:51:44

标签: 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(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()方法,我也似乎无法保留原始对象。

如何在创建新对象时确保原始对象不会更改?

2 个答案:

答案 0 :(得分:0)

令人惊讶的是,虽然copy = self不是副本,但您的错误实际上与此无关。我认为你甚至不需要那里的副本。

您的错误是由于双重格式化字符串:

f"A + {0}".format(other)

f"A + {0}"是一个f字符串。与format不同,它将文本0计算为Python表达式,并将结果对象的字符串表示替换为结果字符串,从而生成"A + 0"。在format上拨打copy.data.eval("A + 0") 没有做任何事情,因为没有格式占位符。你最终打电话了

sqoop import \
--connect jdbc:mysql://localhost/loudacre \
--username training \
--password training \
--target-dir /axl172930/loudacre/pset1 \
--split-by acct_num \
--query 'SELECT first_name,last_name,acct_num,city,state from accounts a 
JOIN (SELECT account_id, count(device_id) as num_of_devices 
      FROM accountdevice group by account_id 
      HAVING count(device_id) = 1)d ON a.acct_num = d.account_id 
      WHERE $CONDITIONS'

而不是添加您想要添加的内容。

答案 1 :(得分:-2)

你有deepcopy吗?

from copy import deepcopy
dupe=deepcopy(thing)
#now thing and dupe are two separate objects