Python:添加到列表中一个对象的字典会更改列表中每个其他对象的所有字典

2023-12-13

所以 Python 不是我的强项,而且我遇到了一个我认为很奇怪的问题。我已将问题缩小到几行代码,并进行了简化以使提出这个问题变得更容易。我有一个对象列表,这个对象:

class FinalRecord():
     ruid = 0
     drugs = {}

我在 shell 中创建它们,如下所示:

finalRecords = []
fr = FinalRecord()
fr.ruid = 7
finalRecords.append(fr)
fr2 = FinalRecord()
fr2.ruid = 10
finalRecords.append(fr2)

一旦我想更改一个对象上的药物指令,它也会更改另一个对象上的药物指令

finalRecords[0].drugs["Avonex"] = "Found"

我打印出这个:

finalRecords[1].drugs

它显示:

{'Avonex':'Found'}

当我期待它实际上是空的时。我知道我不完全理解 Python 如何处理对象,有人可以帮助我吗?


这样做的原因是因为drugs是一个类属性。因此,如果您对一个对象进行更改,它实际上也会对其他对象进行更改。

如果您希望不出现这种行为,那么您正在寻找实例属性。将药物放入您的__init__像这样:

class FinalRecord():
    def __init__(self):
        self.ruid = 0
        self.drugs = {}

请注意使用self,这是对您的对象的引用。

这是一些信息类与实例属性

因此,完整的演示说明了这种行为:

>>> class FinalRecord():
...     def __init__(self):
...         self.ruid = 0
...         self.drugs = {}
...
>>> obj1 = FinalRecord()
>>> obj2 = FinalRecord()
>>> obj1.drugs['stuff'] = 2
>>> print(obj1.drugs)
{'stuff': 2}
>>> print(obj2.drugs)
{}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:添加到列表中一个对象的字典会更改列表中每个其他对象的所有字典 的相关文章

随机推荐