我有一个实例变量似乎被视为类变量,因为它更改了对象的所有实例.
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)
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我得到以下内容:
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
Run Code Online (Sandbox Code Playgroud)
如何确保x1.genes不影响x2.genes?
这里有两个问题.
首先,数据框是可变对象,并且两个实例都引用相同的对象.您将需要使用提供每个实例的新副本df.copy().您也可以在__init__函数本身中复制数据帧.这将是"更安全",因为可以确保您不重用数据框,但这也可能会创建不必要的副本.
其次,与您的示例无关,提供可变默认参数存在问题genes = pd.DataFrame().此数据框保存在未绑定的__init__函数上,就像它是该函数的成员数据一样(请参阅参考资料__init__.__func__.func_defaults).相反,使用默认参数None或其他一些sentinel值,然后在实例化时将实例化一个新的数据框genes is None.
您的代码genes在DNA类的实例属性的意义上工作正常.
但是,您只创建了一个数据帧.您为其指定名称df,并使其成为genes两者的属性,x1并x2使用
self.genes = genes
Run Code Online (Sandbox Code Playgroud)
分配.由于赋值永远不会复制数据,因此您仍然只有一个数据帧可以在x1和之间共享x2.
要解决此问题,您可以在将数据框传递给DNA构造函数或使用之前复制数据框
self.genes = genes.copy()
Run Code Online (Sandbox Code Playgroud)
在__init__方法中.
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |