Python使用复制方法分隔对象

时间:2013-11-25 01:30:37

标签: python-2.7 copy

每一个人。我试图使用方法copy(),但我真的很沮丧似乎我的程序中有bug。当比较c1和c2时,我应该只得到ct = 99而不是ct = 0,但事实证明还有那么多额外的术语。 只需运行代码,您就可以立即发现奇怪的事情。谢谢大家。

注意:此问题是一般编程问题,与Fourvector无关。

import numpy as np

class FourVector:
    """ This document is a demonstration of how to create a class of Four vector """

    def __init__(self, ct=0, x=1, y=5, z=2, r=None):
        self.ct = ct
        self.r =  np.array(r if r else [x,y,z])
    def __repr__(self):
        return "%s(ct=%g,r=array%s)"% ("FourVector",self.ct,str(self.r))
    def copy(self):
        return FourVector(self.ct,self.r)

c1=FourVector(ct=0,r=[1,2,3]) # Note: c1,c2 here are objects, we used __repr__ to make them printable
print c1
c2=c1.copy() #use method copy within object c1
c2.ct=99
print c2

1 个答案:

答案 0 :(得分:1)

复制时,您将两个未命名的参数传递给FourVector.__init__。 Python在位置上解释它们,因此您实际上是在调用它们:

FourVector.__init__(new_self, ct=self.ct, x=self.r, y=5, z=2, r=None)

r仍为None,因此new_self.r被指定为np.array([self.r, y, z])。这就是c2中的数组有额外条款的原因。

相反,您需要告诉Python第二个值应该是r参数,而不仅仅是第二个参数:

def copy(self):
    return FourVector(self.ct, r=self.r)

或者,您可以重新排序参数:

def __init__(self, ct, r=None, x=1, y=5, z=2):

甚至删除xyz个参数,并将其作为r的默认值提供:

def __init__(self, ct, r=[1,5,2]):