Python的索引与切片原来该这样理解
前言索引indexing和切片slicing是 Python 序列的两把基础钥匙但很多人是用得会、说不出。一旦遇到边界情况——为什么s[100]报错而s[100:200]不报错为什么s[::-1]能反转s[-0]到底是什么——就只能靠试。其实它们背后有几条很一致的定义理顺之后边界情况不用记也能推出来。要澄清一个流传很广的误解切片是索引的批量版。这个说法不太准确。索引和切片是两套不同的规则索引要求下标必须落在[0, len)之内越界是错误切片则先把下标规整到合法范围再按左闭右开取一段越界被容忍。正因为规则不同才有索引报错、切片不报错这个看似矛盾的现象。本文用一个统一的心智模型把两者串起来配上一张下标对照图最后归纳成可以现场推导的几条规则。代码基于 Python 3.8 及以上。Python 2.7 已于 2020 年 1 月 1 日停止维护本文不使用 Python 2 的语法。一、先建立一张下标图拿s Python举例把每个字符、正下标和负下标画在一起看字符 P y t h o n正下标 0 1 2 3 4 5负下标 -6 -5 -4 -3 -2 -1两条规律一眼可见正下标从0开始最大的合法下标是len(s) - 1也就是5。负下标从-1开始表示最后一个字符最小的是-len(s)也就是-6。负下标-k的值等于len(s) - k当k在1..len范围内。所以s[-1]和s[5]是同一个字符。二、索引必须落在合法范围索引的规则只有一句下标必须在[-len, len-1]内否则抛IndexError。# 适用于 Python 3.8s Pythonprint(s[0]) # Pprint(s[5]) # nprint(s[-1]) # nprint(s[-6]) # P# print(s[6]) # IndexError: string index out of range# print(s[-7]) # IndexError: string index out of range注意负下标下界是-len-6合法-7就越界了。关于-0要特别提一句-0就是0它不是从末尾数的第 0 个。s[-0]等于s[0]取到第一个字符。很多人以为s[-0]会像s[-1]那样指向末尾这是个典型误解。三、切片先规整边界再左闭右开切片的规则稍多但都是确定的。对s[i:j]i省略或为None时取0j省略或为None时取len(s)。i或j为负时加上len(s)。规整后小于0的按0处理大于len(s)的按len(s)处理。结果包含下标k条件是i k j。若i j结果为空。# 适用于 Python 3.8s Pythonprint(s[1:4]) # yth 下标 1、2、3print(s[-3:-1]) # ho 等价于 s[3:5]print(s[1:100]) # ython 100 被夹成 6print(s[-100:2]) # Py -100 被夹成 0print(s[4:1]) # 起点 终点官方文档对这段规则的原文表述是i或j小于-len(s)时用0大于len(s)时用len(s)i大于等于j时切片为空。所以切片永远不会因为越界而报错最多给你一个空串。切片语法背后其实是一个内置对象slice。s[1:4]在求值时相当于构造slice(1, 4)再交给下标操作两个参数时签名是slice(start, stop)三个参数是slice(start, stop, step)# 适用于 Python 3.8s Pythonsl slice(1, 4)print(s[sl]) # yth与 s[1:4] 等价print(sl.start, sl.stop) # 1 4print(sl.step) # None需要把一段范围当作数据传来传去时slice对象比分别传start、stop更整洁比如自定义类实现__getitem__时就能直接收到它。四、理解负数步长带步长的切片s[i:j:k]取的是下标序列i, ik, i2k, ...直到到达j不含j。关键是步长的正负会改变i、j的默认值步长i默认j默认正k 00从头len(s)到尾负k 0len(s) - 1从尾开头之前即到下标 0 为止# 适用于 Python 3.8s Pythonprint(s[::2]) # Pto 下标 0、2、4print(s[1::2]) # yhn 下标 1、3、5print(s[::-1]) # nohtyP 整串反转print(s[4:1:-1]) # oht 下标 4、3、2print(s[1::-1]) # yP 下标 1、0有了这张表s[::-1]为什么能反转就清楚了负步长让起点默认在末尾、终点默认在开头之前于是从后往前逐个取。而s[4:1:-1]手动指定了i4、j1取下标 4、3、2到 1 停不含 1。k不能为0否则抛ValueError。五、切片赋值只对可变序列成立对str、tuple这类不可变序列切片只能读对list这类可变序列切片还能写。# 适用于 Python 3.8lst [0, 1, 2, 3, 4, 5]lst[2:4] [a, b, c] # 右侧个数不必等于左侧长度print(lst) # [0, 1, a, b, c, 4, 5]但str不行# 适用于 Python 3.8s Python# s[0:2] Ja # TypeError: str object does not support item assignment原因还是那句str不可变。想改字符串只能拼出新串。实战用同一套规则解析定长字段定长格式的记录每段占固定字符数是索引和切片的经典用武之地。# 适用于 Python 3.8# 假设每行定长姓名 6 字符、年龄 3 字符、部门 4 字符共 13 字符LINE Alice 025研发 # 0..5 6..8 9..12def parse_fixed(line):line line.ljust(13) # 不足补齐避免切片拿短name line[0:6].strip()age line[6:9].strip()dept line[9:13].strip()return name, age, deptprint(parse_fixed(LINE)) # (Alice, 025, 研发)这里每个字段的起点是上一个字段的终点正因为切片左闭右开[0:6]和[6:9]首尾相接、不重不漏。如果切片是左闭右闭每一段都得写成[起点:终点-1]很容易差一。常见坑点混淆索引与切片的容错性❌ 以为s[len(s)]会像切片那样安静返回空✅s[len(s)]抛IndexError只有s[len(s):]这类切片才返回空串把s[-0]当成末尾❌s abc; print(s[-0])期待c✅-0就是0输出a要末尾用s[-1]弄错左闭右开❌Python[0:2]以为能取到Pyt✅ 它只取下标 0、1得到Py要含下标 2 得写[0:3]负数步长下起点终点想当然❌s abcdef; s[3:0:-1]以为能取全到开头实际只得到下标 3、2、1✅ 负步长要取到开头终点要省略或写Nones[3::-1]得到dcba用find结果当索引却不判 -1❌i s.find(:); s[i 1:]找不到时-1 1 0返回整串✅ 先判断i ! -1或改用partition并检查分隔符非空拿切片去做深拷贝❌ 嵌套列表b a[:]后改b[0][0]a也跟着变✅ 切片是浅拷贝深拷贝要copy.deepcopy(a)步长写 0❌s[::0]→ValueError: slice step cannot be zero✅ 步长不允许为 0取全部就省略步长对字符串用切片赋值❌s[1:2] X→TypeError✅ 只有可变序列支持切片赋值字符串要拼出新串总结问题规则索引合法范围-len到len-1越界抛IndexError切片越界下标夹到[0, len]不报错左闭右开含start不含stopstart stop得空串-0等于0不是末尾正步长默认从0到len(s)负步长默认从len-1到开头之前切片赋值只有可变序列支持str不支持索引和切片不是同一件事的两种写法而是两套定位规则。索引像精确取一件要求坐标必须有效切片像划一段范围坐标超出会被温和地收进边界。把左闭右开和负步长改变默认方向这两条吃透s[::-1]反转、s[1:100]不报错、s[-0]取到首字符这些现象就都能当场推出来而不是靠背例子。最后提一句版本本文的写法面向 Python 3。Python 2 里print是语句而不是函数3 里必须写print(...)xrange已移除3 里range本身就是惰性的unicode类型统一成了str整数除法也从3 / 2 1变成了3 / 2 1.5整除要写//。Python 2.7 已于 2020 年 1 月 1 日停止维护这些旧写法不要再用了。

相关新闻

Webogram图片处理:WebP格式支持与客户端压缩技术

Webogram图片处理:WebP格式支持与客户端压缩技术

Webogram图片处理:WebP格式支持与客户端压缩技术 在即时通讯应用中,图片处理的效率直接影响用户体验和数据流量消耗。Webogram作为Telegram的Web端实现,采用了多种优化技术来平衡图片质量与传输效率。本文将深入解析Webogram的图片处理机制&…

2026/10/10 5:31:35 阅读更多 →
Node.js内存溢出?深入解析V8堆与FATAL ERROR的根治方案

Node.js内存溢出?深入解析V8堆与FATAL ERROR的根治方案

看到 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 这行报错,相信不少用 Node.js 跑服务、写脚本或者做前端构建的朋友都头皮发麻过。这串英文翻译过来就是典型的堆内存分配失败,V8 引擎…

2026/10/10 5:30:35 阅读更多 →
基于FlexLM日志与Grafana的开源SolidWorks授权监控看板搭建指南

基于FlexLM日志与Grafana的开源SolidWorks授权监控看板搭建指南

做企业CAD/PLM管理的朋友,肯定都有过这个尴尬时刻:老板站在工位旁边问,“今年SolidWorks的授权到底够不够用?明年要不要增购?能不能把闲置的许可收回来?”你打开SolidNetWork License Manager,对…

2026/10/10 5:30:35 阅读更多 →

最新新闻

LeetCode 2413 Smallest Even Multiple 题解:奇偶分类与位运算的 O(1) 解法(codeforces-go 仓库实战指南)

LeetCode 2413 Smallest Even Multiple 题解:奇偶分类与位运算的 O(1) 解法(codeforces-go 仓库实战指南)

科学计算 【免费下载链接】codeforces-go 算法竞赛模板库 by 灵茶山艾府 💭💡🎈 项目地址: https://gitcode.com/GitHub_Trending/co/codeforces-go 点击查看 免费下载 本篇技术指南以 codeforces-go 仓库中 LeetCode 第 311 场周…

2026/10/10 6:06:48 阅读更多 →
纯虚函数与抽象类:接口该怎么设计

纯虚函数与抽象类:接口该怎么设计

设计一套可扩展的 C 系统时,你迟早会写出「只定义契约、不提供实现」的类:它规定「凡是我的子类都必须有 area() 和 draw(),但怎么实现我不管」。这种类就是抽象类(abstract class),靠 纯虚函数&#xff08…

2026/10/10 6:06:48 阅读更多 →
业务参与者规则不显示构件包?沿工作流运行时加载链路排查

业务参与者规则不显示构件包?沿工作流运行时加载链路排查

看到“业务参与者规则没有显示构件包及构件包下流程事件,work目录下也未生成当前构件包目录”这个描述,我第一反应是:这不是一个单纯的界面显示问题,而是服务在运行态压根没有把目标构件包加载进来。业务参与者规则界面显示的构件…

2026/10/10 6:06:48 阅读更多 →
Linux 端口不通怎么排查?firewalld 不是超时而是 No route to host,三台真机实测 firewalld / ufw / iptables / SELinux

Linux 端口不通怎么排查?firewalld 不是超时而是 No route to host,三台真机实测 firewalld / ufw / iptables / SELinux

这一篇讲什么 「端口不通」是最常见也最容易瞎折腾的问题:服务起了、防火墙也开了,外面还是连不上。本篇在三台机器上把排查链条从头到尾实跑一遍:先分清报错类型 → 本机在不在监听 → 防火墙 → SELinux / AppArmor。 实测环境同(一):CentOS 7.9(VMware)、Rocky 9.8、Ubuntu …

2026/10/10 6:06:48 阅读更多 →
CentOS 7 yum 源失效怎么办?vault 返回 403、EPEL 7 卡死,三台真机实测能用的换源方法(附 Rocky 9 / Ubuntu 24.04)

CentOS 7 yum 源失效怎么办?vault 返回 403、EPEL 7 卡死,三台真机实测能用的换源方法(附 Rocky 9 / Ubuntu 24.04)

这个系列是什么 「Linux 实战」按线上真正会撞上的事情排:认清系统和装软件(本篇)、端口不通、服务起不来、磁盘满了、网络和 SSH、日志与性能…… 每一篇都做两件事:①所有命令在真机上跑过、贴原始输出;②同一件事在三个系统上各跑一遍 —— CentOS 7 还大量在线上跑着,新机器…

2026/10/10 6:06:48 阅读更多 →
极点五笔10周年版:确定性优先的五笔输入法重构

极点五笔10周年版:确定性优先的五笔输入法重构

1. 项目概述:这不只是一个输入法,而是一次对中文输入底层逻辑的重新校准“极点五笔:10周年版全面升级体验”——看到这个标题,我第一反应不是点开下载,而是下意识摸了摸键盘右下角那块被手指磨得发亮的空格键。十年&am…

2026/10/10 6:05:48 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →