实现二维数组__getitem__方法触发TypeError,求排查指导
问题排查与解决思路
错误原因
当执行my_array[1][0]时,Python会分两步执行:
- 先调用
my_array.__getitem__(1),此时传入的item是整数1 - 你的代码进入
else分支,尝试执行x, y = item,但整数是不可迭代对象,无法解包成两个变量,因此触发TypeError
你的代码只处理了两种场景:
- 数组为一维(
shape[0]==1)时,直接返回一维数组的索引结果 - 期望
item是一个可迭代对象(比如元组(x,y))来直接定位二维元素
但完全没考虑连续索引的情况——也就是第一次索引返回行对象,第二次索引再从行里取元素。
解决思路
需要修改__getitem__,让它能处理两种索引输入:
- 当输入是整数时:返回对应行的一维数组实例(确保这个实例也实现了
__getitem__,支持后续的索引操作) - 当输入是二元元组时:直接返回对应位置的元素
修改后的示例代码:
def __getitem__(self, item): # 处理连续索引的情况:先取行 if isinstance(item, int): # 假设你有对应的一维数组类,比如My1DArray,传入该行的数值 return My1DArray(self.twoDim[item]) # 处理直接定位元素的情况:(x,y)元组索引 elif isinstance(item, tuple) and len(item) == 2: x, y = item return self.twoDim[x][y] # 处理非法索引 else: raise IndexError("索引格式错误:使用整数获取行,或使用(x,y)元组获取元素")
补充说明
- 如果没有单独的一维数组类,也可以返回一个列表,但这样会丢失自定义数组类的特性(比如你实现的其他方法),更推荐返回自定义的一维实例
- 原代码中
shape[0]==1的判断可以整合进上述逻辑:当数组是一维时,整数索引直接返回元素,或者返回长度为1的行对象,取决于你期望的行为(比如支持my_array[0]和my_array[(0,0)]两种方式获取元素)
内容的提问来源于stack exchange,提问作者ili
相关产品推荐
相关产品推荐

