Python添加到字典中的意外列表中


class Animal:
def __init__(self, name='', child=[]):
self.name=name
self.child=child
val = []

dog = Animal(name="Foo")
val.append(dog.__dict__)
cat = Animal(name='John')
cat.child.append('Doe')
val.append(cat.__dict__)
print(val)

结果:

[{'name': 'Foo', 'child': ['Doe']}, {'name': 'John', 'child': ['Doe']}]

预期:

[{'name': 'Foo', 'child': []}, {'name': 'John', 'child': ['Doe']}]

我认为这与内存分配有关,但我无法理解它是如何工作的。

字典是引用类型的变量。引用是指值(对象(在内存中的特定位置的名称。这意味着在实例化dict之后,它总是指向内存中的同一位置。无论你是否编辑你的dict.所以一个简单的解决方案,你的代码是:

class Animal:
def __init__(self, name='', child=None):
self.name=name
self.child=child
if self.child is None:
self.child = []

val = []
dog = Animal(name="Foo")
print(dog.__dict__)
val.append(dog.__dict__)
cat = Animal(name='John')
cat.child.append('Doe')
val.append(cat.__dict__)
print(val)

这样,每次从Animal类创建对象时,它都会在内存中保留一个新的位置。

您可以使用数据类并设置列表的默认工厂

from dataclasses import dataclass, field, asdict
from typing import List
@dataclass
class Animal:
name : str 
children : List[str] = field(default_factory=list)
a=Animal(name="Foo")
b=Animal(name='John')
b.children.append('Doe')
val = [
asdict(x) for x in [a,b]
]
print(val)

最新更新