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]

問題:

印刷された 2 行目は、最初の行のように見えるはずです。self.A 内の値を変更できるようにしたいのですが、永続的に変更したくありません。func1 は self.A への参照またはポインタしか受け取っていないと思っていましたが、self.A を上書きしているようです。

これを修正するにはどうすればよいですか?

各インスタンス内のデータを永続的に変更するには func1 を使用する必要がありますが、self.A 内では変更しないでください。

4

2 に答える 2

0

self.A を変更したくない場合は、 func1 を呼び出すときに次を渡す必要があります。

self.func1(list(self.A))
于 2012-08-31T22:57:57.510 に答える
0

問題は、func1メソッドがその引数をその場で変更することです:

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

そうするのには十分な理由があると思いますが、経験したように、意図しない副作用が生じる可能性があります。次の 2 つのオプションがあります。

  • その場で引数func1を変更しないように変更してください。例えば:

    def func1(self, arg2):
        arg2_copy = arg2.copy()
        arg2_copy[:,:] += ....
    
  • に引数のコピーを渡しますfunc1:

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

.copyであると仮定したため、メソッドを使用しself.Aましたndarray。そうでない場合は、適切なトリックを使用する必要があります (別のリストや別の辞書を作成するなど...)。

于 2012-09-01T14:01:28.913 に答える