【问题标题】:Python dictionary overriding error?Python字典覆盖错误?
【发布时间】:2012-11-02 05:11:19
【问题描述】:

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

假设你有一个模块“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 文件的结构是这样的,因为我目前在一个项目中遇到了这个问题,而且我的类遵循相同的结构。 提前谢谢大家, 杰拉尔达摩

【问题讨论】:

标签: python class dictionary


【解决方案1】:

实际上,您在所有类中都引用了一个全局且可变的对象。所以你会看到所有这些变化都反映出来。这是因为您正在更改同一个对象。您需要 copy() 每个类实例的字典以获得全局实例的唯一副本。

self.classData = data.copy()

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

self.classData = copy.deepcopy(data)

【讨论】:

  • 我认为您的意思是“针对每个实例”而不是“针对每个类”。
猜你喜欢
  • 2012-08-10
  • 1970-01-01
  • 2011-01-04
  • 2019-02-13
  • 2021-01-14
  • 1970-01-01
  • 2015-05-03
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多