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

Spe*_*ton 4 python python-3.x

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

class FinalRecord():
     ruid = 0
     drugs = {}
Run Code Online (Sandbox Code Playgroud)

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

finalRecords = []
fr = FinalRecord()
fr.ruid = 7
finalRecords.append(fr)
fr2 = FinalRecord()
fr2.ruid = 10
finalRecords.append(fr2)
Run Code Online (Sandbox Code Playgroud)

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

finalRecords[0].drugs["Avonex"] = "Found"
Run Code Online (Sandbox Code Playgroud)

我打印出这个:

finalRecords[1].drugs
Run Code Online (Sandbox Code Playgroud)

它显示:

{'Avonex':'Found'}
Run Code Online (Sandbox Code Playgroud)

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

idj*_*jaw 5

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

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

class FinalRecord():
    def __init__(self):
        self.ruid = 0
        self.drugs = {}
Run Code Online (Sandbox Code Playgroud)

请注意 的使用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)
{}
Run Code Online (Sandbox Code Playgroud)