0

好的,所以,我不太确定如何用一个简洁的短语来表达这个问题,所以如果一个模组能想出一个更好的标题,请修复它。

所以假设你有一个模块“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()

但是,如果 dict 的值也是可变的,即使这样也可能会给您带来问题。这是因为该copy()方法只进行浅拷贝。最安全的做法是使用copy模块的 deepcopy 功能进行深层复制。把它放在你的类初始化器中。

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