Python动态数组类:如何修改__getitem__方法支持负索引
如何让动态数组的__getitem__支持负索引访问?
没问题,这个需求很常见,咱们一步步来改。首先得明白Python里负索引的逻辑:-1对应数组的最后一个元素,-2对应倒数第二个,以此类推,直到 -self._n 对应第一个元素。你的现有代码因为只检查了正索引范围,所以负索引会直接抛出错误,咱们只需要调整索引的判断逻辑,或者把负索引转换成合法的正索引就行。
方案一:将负索引转换为正索引(推荐,兼容性更强)
这种方式先把负索引转成正索引,再进行有效性检查,就算你的底层数组 self._A 不支持负索引也能正常工作:
def __getitem__(self, k): """Return element at index k, supporting negative indices.""" # 把负索引转换为对应的正索引 if k < 0: k += self._n # 检查转换后的索引是否在有效范围内 if not 0 <= k < self._n: raise IndexError('Invalid index.') return self._A[k]
方案二:直接扩展索引检查范围
如果你的底层数组 self._A 本身是Python内置列表(天然支持负索引),那可以直接放宽索引的检查条件,不用转换:
def __getitem__(self, k): """Return element at index k, supporting negative indices.""" # 允许索引范围从 -self._n 到 self._n - 1 if not (-self._n <= k < self._n): raise IndexError('Invalid index.') return self._A[k]
为什么这样改?
- 原来的条件
0 <= k < self._n只覆盖了正索引,负索引会直接触发IndexError; - 方案一通过
k += self._n把负索引转成正索引(比如-1变成self._n -1,也就是最后一个元素的正索引); - 方案二则直接允许合法的负索引范围,利用Python列表本身的负索引特性来访问元素。
你可以根据自己底层数组 self._A 的类型来选择合适的方案,两种都能完美支持负索引访问~
内容的提问来源于stack exchange,提问作者Hoon Lee
相关产品推荐
相关产品推荐

