2

最下位のメソッドがオブジェクトを変更するクラスの一部であるオブジェクトを使用して別のメソッドを呼び出すメソッドを使用してクラスを実装しようとしています。私の実装はもう少し複雑なので、私が話していることを理解できるように、ダミーのコードをいくつか投稿します。

class test:
    def __init__(self,list):
        self.obj = list
    def mult(self, x, n):
        x = x*n
    def numtimes(self, n):
        self.mult(self.obj, n)

ここで、このタイプのオブジェクトを作成して numtimes メソッドを実行すると、self.obj は更新されません。

m = test([1,2,3,4])
m.numtimes(3)
m.obj  #returns [1,2,3,4]

[1,2,3,4,1,2,3,4,1,2,3,4]

基本的には、mult メソッドに self.obj を渡して、m.obj を呼び出したときに [1,2,3,4,1,2,3,4, [1,2,3,4] の代わりに 1,2,3,4]。

これは、Pythonがオブジェクトを引数としてメソッドに渡す方法を理解するだけの問題だと思います(オブジェクトのコピーを作成しているように、代わりにポインターを使用する必要があります)が、そうではないかもしれません。私はPythonが初めてで、ここで本当に助けを借りることができます。

前もって感謝します!!

4

2 に答える 2

3

可変性というより大きな話題を取り上げさせてください。

リストは可変オブジェクトであり、可変操作と不変操作の両方をサポートします。つまり、リストをその場で変更する操作と、新しいリストを返す操作です。対照的に、タプルのみが不変です。

したがって、リストを乗算するには、次の 2 つの方法を選択できます。

  1. a *= b

これは変更可能な操作であり、「a」をその場で変更します。

  1. a = a * b

これは不変の操作です。'a*b' を評価し、正しい値で新しいリストを作成し、その新しいリストに 'a' を割り当てます。

ここに、すでに、問題の解決策があります。しかし、少し読み進めることをお勧めします。リスト (およびその他のオブジェクト) をパラメーターとして渡す場合、同じリストへの新しい参照または「ポインター」を渡すだけです。したがって、そのリストで変更可能な操作を実行すると、渡したものも変更されます。次のように書くと、結果は非常に微妙なバグになる可能性があります。

>>> my_list = [1,2,3]
>>> t = test(my_list)
>>> t.numtimes(2)
>>> my_list
[1,2,3,1,2,3]  # Not what you intended, probably!

というわけで、私の最後のお勧めです。変更可能な操作を使用することを選択できますが、それで問題ありません。ただし、次のように、引数から新しいコピーを作成します。

def __init__(self,l):
    self.obj = list(l)

または不変操作を使用して、それらを自分自身に再割り当てします。

def mult(self, x, n):
    self.x = x*n

または両方を行ってください。余分な安全性を確保しても害はありません:)

于 2013-10-06T07:54:24.690 に答える