我有一个实例变量,它似乎被视为类变量,因为它更改了对象的所有实例。

class DNA(object):

      def __init__(self,genes = pd.DataFrame(), sizecontrol=500, name='1'):
        self.name = name
        self.genes = genes  # This attribute should be an instance variable
        self.GeneLen = self.genes.shape[1]
        self.sizecontrol = sizecontrol
        self.Features = []
        self.BaseFeats = []
        random.seed(self.name)

当我运行它时,我得到以下信息:
 In[68]: df = pd.DataFrame(data)

 In[69]: x1 = DNA(genes=df)

 In[70]: x2 = DNA(genes=df)

 In[71]: x1.genes["dummy"] = 'test'

 In[72]: x2.genes["dummy"].head(4)
 Out[72]:
  0 test
  1 test
  2 test
  3 test

如何确保 x1.genes 不会影响 x2.genes?

最佳答案

这里有两个问题。

首先,数据框是可变对象,并且您的两个实例都引用同一个对象。您需要使用 df.copy() 为每个实例提供一个新副本。您也可以在 __init__ 函数本身中复制数据帧。这将是“更安全”,因为可以确保您不会重用数据帧,但这也可能会创建不必要的副本。

其次,与您的示例无关,提供可变默认参数 genes = pd.DataFrame() 存在问题。此数据框保存在未绑定(bind)的 __init__ 函数上,就像它是该函数的成员数据一样(请参阅 __init__.__func__.func_defaults )。相反,使用 None 或其他一些标记值的默认参数,然后在 genes is None 时实例化一个新的数据帧。

10-06 08:37