python - 我已经制作了同一类的两个对象。为什么更改一个实例的数据最终会更改另一个实例的数据?
问题描述
我写了一个名为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
解决方案
默认参数仅在声明类时评估一次,因此两个实例共享相同的列表(一个是默认参数 [] 到init)。
我认为 PyCharm 甚至会在您使用可变默认参数时发出警告。
推荐阅读
- apache-spark - Spark 存储级别“NONE”与“MEMORY_ONLY”
- asp.net - 触发保存事件时,添加到 gridview 的行不会持续存在
- python - python中字典中的函数
- azure-active-directory - Saml 响应发送到应用注册下的默认回复 URL
- rcpp - 使用 Rcpp 时仅使用正数的计算返回负数
- ruby - ruby openssl smime 加密
- safari - Safari HTML5 视频不再自动播放
- php - opencart 2.1.0.2-save percent in category.php & 分页/过滤器问题
- python - 从 iPython / Jupyter 嵌入式 Qt 控制台获取结果对象
- c# - 如何处理模拟对象?