You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:05:54