Python 元组(Tuple)实战:用不可变数据结构存储并访问异构数据 文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载本篇技术指南以 TIL 仓库 python/store-and-access-immutable-data-in-a-tuple.md 为核心系统讲解 Python 内置元组tuple的完整用法如何用括号或逗号语法创建元组、如何按位置索引访问元素、如何通过序列解包一次性把元组展开为多个变量以及为什么元组是不可变的immutable——并用 REPL 运行结果与仓库内多个 Python 文档的实战案例交叉印证。读完本文你将掌握在需要轻量、只读、异构数据容器时选择元组而非列表的完整方案并理解元组在divmod、SQLite 查询结果、pytest 参数化、字典键等场景中的底层工作方式。一、什么是元组轻量级不可变数据结构元组tuple是 Python 内置的序列类型之一与列表list最本质的区别在于异构性heterogeneous元组可以同时存放不同类型的数据。比如一本书的标题字符串、作者字符串和出版年份整数可以放在同一个元组里。不可变性immutable元组一旦创建其元素就不能被修改、添加或删除这一点与可随意增删改的列表截然不同。轻量级light-weight由于不可变元组在哈希、缓存、函数多返回值等只读场景中开销更小、语义更安全。从源码结构看仓库 Python 目录下的多篇文档都印证了元组的这些特性被广泛运用python/access-sqlite-result-values-by-name-with-row-factory.md 中提到sqlite3执行行返回语句后的默认结果形状就是一个元组其值只能按位置访问python/get-quotient-and-remainder-in-one-operation.md 中内置函数divmod的返回值就是一个元组商、余数python/keep-a-tally-with-collections-counter.md 中提到元组是可哈希hashable的因此可以直接用作字典键或缓存键而列表不行。二、创建元组的两种写法1. 显式括号写法最直观、可读性最强的方式是用圆括号把多个以逗号分隔的元素包裹起来 book (An Immense World, Ed Yong, 2022) book (An Immense World, Ed Yong, 2022)这个元组里混合了两种字符串书名、作者和一个整数出版年份正是异构数据的典型示例。2. 省略括号的逗号写法Python 中真正决定元组身份的是逗号而不是括号。因此可以完全省略括号直接用逗号分隔元素 book2 The Shining, Stephen King, 1977 book2 (The Shining, Stephen King, 1977)从输出可以看到即使没有写括号变量book2依然被绑定为一个元组。需要留意的是这一语法特性的副作用——它是很多函数隐式返回多个值的底层机制。仓库文档 python/get-quotient-and-remainder-in-one-operation.md 中的divmod就是最好的例证 divmod(3666, 3600) (1, 66)divmod返回的结果正是逗号分隔生成的元组第一个值是商小时数第二个值是余数剩余秒数。3. 单元素元组的易错点创建只含一个元素的元组时必须在元素后补一个逗号否则 Python 只会将其视为一个普通值例如一个数字或字符串而不是元组 single (hello,) # 这才是包含一个元素的元组 single (hello,) not_a_tuple (hello) # 这只是字符串 type(not_a_tuple) class str这是元组最常见的踩坑点之一在阅读和书写代码时需要特别留意。三、按位置访问元组元素创建元组之后可以通过下标index从 0 开始按位置访问任意元素 book[0] An Immense World book[1] Ed Yong book[2] 2022book[0]取到第一个元素书名book[1]取到第二个元素作者book[2]取到第三个元素出版年份。这与列表的访问方式完全一致因为二者都是序列类型。同理负索引、切片等序列通用操作对元组同样适用。四、用序列解包一次性取出所有值除了逐个按下标访问Python 还提供了一种更优雅的方式——序列解包sequence unpacking把元组展开一次性赋值给多个变量 title, author, publication_year book title An Immense World author Ed Yong publication_year 2022左边变量的数量必须与元组的元素数量一致否则会抛出ValueError: too many values to unpack或not enough values to unpack。这种模式在仓库文档中反复出现例如python/access-sqlite-result-values-by-name-with-row-factory.md 中fetchone()默认返回的元组可以被解包成各列的值python/get-quotient-and-remainder-in-one-operation.md 中展示的真实项目代码就利用了解包 divmod的组合hours, remainder divmod(total_seconds, 3600) minutes, remainder divmod(remainder, 60) seconds remainder这种函数返回元组 → 调用方直接解包的配合是 Python 惯用写法idiom能显著减少中间变量的数量。五、不可变性元组与列表的关键分界线元组不可变这一承诺是由解释器强制保证的。尝试对已存在的元素赋值会立刻得到类型错误 book[1] Agatha Christie Traceback (most recent call last): File stdin, line 1, in module TypeError: tuple object does not support item assignmentTypeError: tuple object does not support item assignment说明元组对象根本不支持元素赋值这一操作。这也意味着元组没有append、remove、sort等原地修改方法它只能被整体替换或重新创建。不可变性带来的实际收益可哈希能当字典键或缓存键仓库文档 python/keep-a-tally-with-collections-counter.md 明确指出列表不可哈希所以无法用作字典键而一组int值构成的元组是可哈希的作为键非常好用。类似地仓库文档 python/deduplicate-a-list-into-a-tuple.md 也提到列表不可哈希需要先转换成set或tuple之类的类型才能用于字典键或缓存键。作为函数的多个返回值由于不可变返回元组不会让调用方意外篡改内部数据语义上更安全。去重保序仓库文档 python/deduplicate-a-list-into-a-tuple.md 展示了一个巧妙的组合技——利用字典键保持插入顺序的特性去重再转回元组 l1 [3, 4, 1, 2, 5, 4, 1] tuple(dict.fromkeys(l1)) (3, 4, 1, 2, 5)相比之下直接把列表转成元组不会去重 tuple(l1) (3, 4, 1, 2, 5, 4, 1)多维数据建模仓库文档 python/define-sequence-of-tests-with-parametrize-decorator.md 展示了用元组列表描述一组测试参数每个参数元组对应一次独立的测试执行python/initialize-a-pytorch-tensor.md 则展示了用元组表示张量的维度。六、何时用元组、何时用列表结合上述特性可以给出一个实用的选型参考场景推荐类型原因数据只读、不允许被修改配置、常量、函数多返回值元组不可变语义安全需要作为字典键 / 缓存键 / 放入集合元组可哈希需要随时增删改元素、长度会变化列表可变提供append/remove等需要排序、反转等原地操作列表元组不支持原地修改异构的少量数据一次性打包传递元组轻量、解包方便简而言之能表达这件事以后不会再改时优先用元组需要动态变化的数据集合时用列表。这一取舍在仓库的 python/deduplicate-a-list-into-a-tuple.md、python/access-sqlite-result-values-by-name-with-row-factory.md 等多篇文档中都能找到一致的实践痕迹。七、小结元组用圆括号(item1, item2, ...)或纯逗号分隔两种方式创建后者常被函数用于隐式返回多值。单元素元组必须写成(item,)逗号不可省略。按下标t[0]、t[1]位置访问与列表一致。用a, b, c t序列解包可以一次性把元组展开为多个变量。元组不可变t[1] x会抛出TypeError: tuple object does not support item assignment。不可变性带来可哈希、安全返回、保序去重等实用价值具体案例可继续阅读仓库内的 python/deduplicate-a-list-into-a-tuple.md、python/get-quotient-and-remainder-in-one-operation.md、python/access-sqlite-result-values-by-name-with-row-factory.md 等关联笔记。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐32位小端重定位加法技巧Exploitarium objdump payload如何利用_IO_2_1_stderr_跳板32位小端重定位加法技巧Exploitarium objdump payload如何利用_IO_2_1_stderr_跳板 Exploitarium 是一个开网络安全渗透测试示例工程Python 100天从新手到大师常用数据结构之元组tuple完全指南Python 100天从新手到大师常用数据结构之元组tuple完全指南 导读 本篇是《Python 100天从新手到大师》Day10 的核心章节系统讲文档教程FlexFlow分布式训练实战大规模模型并行化的10个最佳实践指南FlexFlow分布式训练实战大规模模型并行化的10个最佳实践指南 FlexFlow是一个强大的深度学习框架专门用于加速分布式深度神经网络DNN训练。通上一篇Astron Agent 企业落地案例全览Agent RPA 协同、私有化部署与知识库客服的实战路径解析下一篇Substrate 依赖解析zeebo/xxh3 在 Go 中的 XXH3 非加密哈希算法与性能基准实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考