📜  通过 dict 更改实例会更改所有实例 - Python (1)

📅  最后修改于: 2023-12-03 15:12:22.610000             🧑  作者: Mango

通过 dict 更改实例会更改所有实例 - Python

在Python中,当我们创建一个类实例并且将其赋值给一个变量,实际上是将对象的引用存储在该变量中。当我们创建多个实例并将它们赋值给不同的变量时,每个变量都有自己的引用,这样实例之间的任何更改都互不影响。

但是,当我们使用类级别的属性(类的字典)来更改类实例时,这样的更改会影响到所有实例。这是因为类的字典是共享的,它们在内存中只有一个副本。所以一旦字典中的属性被更改,所有实例的相应属性也都会发生改变。

下面是一个示例代码:

class MyClass:
    shared_attribute = []

a = MyClass()
b = MyClass()

a.shared_attribute.append(1)
print(b.shared_attribute)  # 输出 [1]

在这个例子中,我们创建了两个MyClass的实例(ab),它们都有一个名为 shared_attribute 的列表。我们在 ashared_attribute 列表中添加了一个元素,然后打印 bshared_attribute,它也包含了这个元素。这说明,ashared_attribute 列表的修改同时影响了 b 的列表。原因就在于,ab 实际上引用的是同一个列表,而不是两个不同的列表。

为了避免这样的错误,我们应该将类级别的属性(类的字典)和实例属性(实例的字典)区分开,避免它们的混淆。我们可以将这些属性定义为实例属性,而不是类属性,这样每个实例都有自己的属性,彼此之间互不影响。

class MyClass:
    def __init__(self):
        self.instance_attribute = []

a = MyClass()
b = MyClass()

a.instance_attribute.append(1)
print(b.instance_attribute)  # 输出 []

在这个例子中,我们将shared_attribute变成了instance_attribute,同时我们将它定义在了初始化函数__init__中。这样每个实例都会有一个自己的instance_attribute属性,彼此之间互不干扰。

在Python中,通过字典更改实例是一个常见的错误。当你在编写代码时,要时刻关注这一点,以避免造成不必要的麻烦。