首页 > 解决方案 > 我已经制作了同一类的两个对象。为什么更改一个实例的数据最终会更改另一个实例的数据?

问题描述

我写了一个名为Matrix.

class Matrix:
# Initialize a matrix
def __init__(self, rows: int = 1, columns: int = 1, data: list = []):
    self.data = data
    self.rows = rows
    self.columns = columns

我正在尝试仅更改 的一个实例中的Matrix数据,但它会更改两个实例中的数据。

from matrix import Matrix

m1 = Matrix()
m2 = Matrix()

for i in range(5):
    m1.data.append(i)

print(m1.data)
print(m2.data)

# expected result:
# [0, 1, 2, 3, 4]
# []

# actual result:
# [0, 1, 2, 3, 4]
# [0, 1, 2, 3, 4]

编辑:

将 Matrix 类更改为此,我得到了所需的行为:

class Matrix:
    # Initialize a matrix
    def __init__(self, rows: int = 1, columns: int = 1, data: list = []):
        if data:
            self.data = data
        else:
            self.data = []
        self.rows = rows
        self.columns = columns

标签: python

解决方案


默认参数仅在声明类时评估一次,因此两个实例共享相同的列表(一个是默认参数 [] 到init)。

我认为 PyCharm 甚至会在您使用可变默认参数时发出警告。


推荐阅读