自定义Matrix_LA类未定义__setitem__,为何下标赋值仍生效?
为什么未实现
__setitem__的自定义矩阵类还能赋值元素? 你执行的x[1][1] = Fraction(1,7)其实是两次完全独立的索引操作,和你是否实现Matrix_LA的__setitem__毫无关系:
- 第一步
x[1]调用的是你重载的__getitem__方法,返回的是你类内部存储结构self.M里的第2个元素(Python索引从0开始)——也就是某一行的列表对象。 - 第二步
[1] = ...是对这个返回的列表对象本身执行赋值操作,触发的是Python列表自带的__setitem__方法,全程没用到你的Matrix_LA类的任何赋值逻辑。
说白了,你的__getitem__只是把内部的行列表直接暴露出来了,后续赋值操作直接作用在这个行列表的引用上,自然能修改self.M里的元素。
如果想避免这种“意外”的直接修改,你可以:
- 在
__getitem__里返回行的副本(比如return self.M[idx].copy()),这样外部拿到的是行数据的拷贝,修改不会影响原矩阵; - 自己实现
Matrix_LA的__setitem__方法,强制用户通过x[1,1] = ...的方式赋值,同时可以加入合法性检查,比如:
def __setitem__(self, key, value): row, col = key # 这里可以加行、列索引的合法性判断 self.M[row][col] = value
内容的提问来源于stack exchange,提问作者alekscooper
相关产品推荐
相关产品推荐

