0

わかりました。この質問を1つの簡潔なフレーズで表現する方法がよくわかりません。そのため、modがより適切なタイトルを思い付く可能性がある場合は、修正してください。

したがって、モジュール「testModule.py」があるとします。

# testModule.py    
data = {'x': 1, 'y': 2, 'z': 3}

class A:
    def __init__(self):
        pass

class B(A):
    def __init__(self):
        self.classData = data

class C(B):
    def __init__(self):
        B.__init__(self)
        self.classData = {'x': 2, 'y': 2, 'z': 3}

testModuleをファイル「test.py」にインポートします

# test.py
import testModule

b = testModule.B()
c = testModule.C()

print test.data
print b.classData
print c.classData

test.pyを実行すると、次のようになります。

{'x': 1, 'y': 2, 'z': 3}
{'x': 1, 'y': 2, 'z': 3}
{'x': 2, 'y': 2, 'z': 3}

それは期待された、素晴らしい、そしてダンディです...

ただし、testModuleのクラスCを次のように変更する場合:

class C(B):
    def __init__(self):
        B.__init__(self)
        self.classData['x'] = 2

そして、次のようなtest.pyを実行します。

 {'x': 2, 'y': 2, 'z': 3}
 {'x': 2, 'y': 2, 'z': 3}
 {'x': 2, 'y': 2, 'z': 3}

だから私の質問はこれだと思います:辞書の単一の要素を参照してベースモジュールに属する辞書を変更すると、後続のクラスのすべての辞書のその要素が変更されるのはなぜですか(それが理にかなっていることを願っています)。辞書を再定義するだけでは、それは行われません。この問題は本当に私を悩ませ始めているので、助けてください。

現在プロジェクトでこの問題が発生しており、クラスも同じ構造に従っているため、これらの.pyファイルが現在のように構造化されていることを知っておくと便利かもしれません。よろしくお願いします、ジェラルダモ

4

1 に答える 1

3

実際には、すべてのクラスで単一のグローバルで変更可能なオブジェクトを参照しています。そのため、それらすべてに反映された変更が表示されます。これは、同じオブジェクトを変更しているためです。copy()グローバルインスタンスの一意のコピーを取得するには、各クラスインスタンスの辞書が必要です。

self.classData = data.copy()

ただし、辞書の値も可変である場合は、それでも問題が発生する可能性があります。これは、copy()メソッドが浅いコピーのみを行うためです。copy最も安全なのは、モジュールの deepcopy 関数を使用してディープ コピーを作成することです。これをクラス初期化子に配置します。

self.classData = copy.deepcopy(data)
于 2012-11-02T05:28:14.947 に答える