问题: Python 负索引的常见用法

👇 点击展开/折叠 面试背诵模板(建议先背这个) Python 负索引从序列末尾开始计数,`-1` 表示最后一个元素,`-n` 表示倒数第 n 个元素。常用于快速获取末尾元素、切片取末尾子序列,以及在循环中高效访问对称位置。负索引在列表、元组、字符串等有序序列上均适用,配合切片 `[:-k]` 或 `[-k:]` 可灵活截取头部或尾部。注意负索引不能与正索引混用导致越界(如 `[-2:0]` 为空),且负索引也支持步长(如 `[::-1]` 反转序列)。
---

基础用法速览

1
2
3
4
5
6
7
8
9
10
11
nums = [10, 20, 30, 40, 50]

print(nums[-1]) # 50(最后一个)
print(nums[-2]) # 40(倒数第二个)
print(nums[-5]) # 10(倒数第五个,即第一个)

# 切片使用负索引
print(nums[-3:]) # [30, 40, 50](末尾三个)
print(nums[:-2]) # [10, 20, 30](去除末尾两个)
print(nums[-3:-1]) # [30, 40](倒数第3到倒数第1之前)
print(nums[::-1]) # [50, 40, 30, 20, 10](反转)

典型应用场景

场景 负索引写法 说明
获取最后一个元素 seq[-1] 比 seq[len(seq)-1] 简洁且不易出错
获取末尾 N 个元素 seq[-N:] 常用于取最近 N 条记录
去除末尾 N 个元素 seq[:-N] 常用于删除尾部无效数据
反转序列 seq[::-1] 适用于字符串回文检查
获取倒数第 N 个 seq[-N] 注意 N 不能超过长度(否则 IndexError)
对称位置配对 seq[i], seq[-i-1] 首尾元素互换等场景

常见陷阱与边界情况

  • 负索引越界:seq[-len(seq)-1] 会引发 IndexError,因为 -0 仍是 0,无负零概念。
  • 切片空结果:seq[-2:0] 返回空列表,因为负索引与正索引混用且步长默认为正,起始位置在结束之后。
  • 字符串操作:负索引同样适用于字符串,如 "hello"[-1] → "o",回文检查 s == s[::-1]。
  • 与 len() 配合:seq[-1] 等价于 seq[len(seq)-1],但 seq[-0] 仍是 seq[0](负零等于正零)。

与其他语言对比

语言 负索引支持 说明
Python ✅ 原生支持 最常用且自然
JavaScript ❌ 不支持 返回 undefined 或错误
Java ❌ 不支持 编译期报错
C / C++ ❌ 不支持 未定义行为
Ruby ✅ 部分支持 数组支持,但切片行为有别
Go ❌ 不支持 需手动计算 len-1

性能补充

负索引和正索引在底层均通过一次指针偏移实现,性能完全等同(常数时间)。切片时使用负索引也保持了 O(k) 的复制开销(k为切片长度),无额外负担。