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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:56:50