1

クラスAを変更するのはどうですか?最初のものは印刷されます:

{"s":1, "b":2}

二つ目

{"s":3, "b":2}

しかし、私は最初のものと同じになるべきだと思います

class A():
    def __init__(self, **kwargs):
        self.g =""

        for key, value in kwargs.items():
            setattr(self, key, value)           

class B():
    def __init__(self, classA):
        self.f = classA.g


a = A(g={"s":1, "b":2})

print (a.g)

b = B(a)
b.f["s"]=3

print (a.g)
4

1 に答える 1

4

以下で何が起こるか:

インスタンス化するb = B(a)と、B.__init__メソッドが設定されますb.f = a.g

これを把握する簡単な方法は、a.gandを別のオブジェクト (実際の辞書) への参照b.fと見なすことです。これは、それらがオブジェクトを指していることを意味します - それらはオブジェクト自体ではありません。

実行するということは、実行するのと同じ基礎となるオブジェクトを参照するようになったことb.f = a.gを意味します。それだけです。b.fa.g

を行うと、参照する基になるオブジェクトが変更b.f["s"]=3されます。b.f

これはたまたまa.g参照しているものと同じなので、a.g「変更」されています!


コメントへの返信:

を行うときはb.f={"s":3, "b":2}、次の手順を実行します。

  1. 新しい辞書を作成します。{"s":3, "b":2}
  2. 参照を変更して、b.fこの新しい辞書を指すようにします (古い辞書とは関係ありません!)。

これは次と同等です。

new_dict = {"s":3, "b":2}
b.f = new_dict

参照は a.g変更されないため、変更されません。
結果として、同じ基になるオブジェクトをもう参照a.gb.f ないでください。

于 2012-10-29T23:51:45.950 に答える