1

我在初始化对象以及覆盖我不想覆盖的数据的方法时遇到问题。

如果我的术语不正确,我深表歉意,因为我在工作中使用多种编码语言,并且在来回弹跳时往往会忘记一些术语。

例子:

class SR(object):
        def __init__(self,arg1):

            ...some code with arg1...

            ...import some stuff into a,b,c,d,e...

            self.A = array([a,b,c,d,e)]

            print self.A

            self.B = self.func1(self.A)

            print self.A
            print self.B

        def func1(self,arg2):

            arg2[:,:] += ...some math...
            arg2[:,:] *= ...more math...

            arg3 = ...total of some stuff in arg2...

            return arg3

        def func2(self,arg4):
            ...use func3...
            ...use func1...
            return arg5

        def func3(self,arg4):
            return arg6

        def func4(self,arg7):
            ...output some stuff...                   

instance = SR(2012)

data = {...numbers...}
X = instance.func2(data)
instance.func4('label1')

data = {...numbers...}
X = instance.func2(data)
instance.func4('label2')

data = {...numbers...}
X = instance.func2(data)
instance.func4('label3')

data = {...numbers...}
X = instance.func2(data)
instance.func4('label4')

data = {...numbers...}
X = instance.func2(data)
instance.func4('label5')

印刷:

[a,b,c,d,e]
[a,not_b,not_c,d,not_e]
[sum-of-a-not_b-not_c-d-not_e]

问题:

打印的第二行应该看起来像第一行。我希望能够更改 self.A 中的值,但我不想永久更改它们。我认为 func1 只会接收到 self.A 的引用或指针,但它似乎覆盖了 self.A。

我该如何解决?

请记住,我需要使用 func1 来永久更改每个实例中的数据,而不是在 self.A 中。

4

2 回答 2

0

问题是您的func1方法修改了它的参数:

    def func1(self,arg2):
        arg2[:,:] += ...some math...
        arg2[:,:] *= ...more math...

您可能有充分的理由这样做,但正如您所经历的那样,它可能会产生一些意想不到的副作用。那么你有两个选择:

  • 修改func1,以便您不修改适当的参数。例如:

    def func1(self, arg2):
        arg2_copy = arg2.copy()
        arg2_copy[:,:] += ....
    
  • 将参数的副本传递给func1

    self.B = self.func1(self.A.copy())
    

我使用了一种.copy方法,因为我认为self.Andarray. 如果不是这样,您将不得不使用适当的技巧(例如制作另一个列表或另一个字典......)

于 2012-09-01T14:01:28.913 回答
0

如果您不想更改 self.A,那么当您调用 func1 时,您应该通过:

self.func1(list(self.A))
于 2012-08-31T22:57:57.510 回答