元组
一排有顺序、写好之后结构就不该被改写的值;适合表示成套出现的数据。
它是什么
元组 也是有顺序的一排值,常用圆括号写成。和 列表 不同,元组一旦创建,就不能改某个位置、也不能追加。它适合表示「本来就该成套出现、中途不该拆改」的数据:一个点的 (x, y),一次观测的温度与压强,函数 一次返回的多个值。克制在这里不是缺点,而是对问题结构的声明:这些格子指向谁,在这份对象的生命周期里应当稳定。
point = (3, 4)
x, y = point名字从哪来
tuple 来自数学里的 n-tuple(n 元组),拉丁语根和「成倍、成套」有关:一对 pair、三元组 triple,再推广到任意 n 个按顺序排好的对象。编程借用这个词,强调「固定长度的一组」。Python 里,逗号才是组成元组的关键。point = 3, 4 也是元组;括号多半是为了看清楚。单元素元组必须写成 (3,),那个逗号不能省,否则只是括号里的一个数。() 是空元组;(3) 只是整数 3。
它怎么工作
可以用下标读取,也可以解包到若干 变量。试图给 point[0] = 0 赋值,会引发 异常。元组可以当作 字典 的键,列表一般不可以——因为键必须是不可变的。函数用 return x, y 时,送出去的就是一个元组。接住时若只用一个名字,接到的是整个元组,而不是其中某一个数。
元组里如果装着可变对象(例如一个列表),那个内部列表仍可能被改。元组保证的是「这一格指向谁」不变,不是「指向的对象内部永远冻住」。不可变指的是元组结构本身。把这一层与「内部绝对改不了任何东西」混为一谈,会在嵌套结构上误判。
生活里在哪里
身份证号与姓名成套出现,不该在中途只改一半;地图上一个点的经纬度;实验记录里「温度、压强」这一对读数,作为一次观测。这些组合一旦拆开改写,所指的已经不是原来那一次事实。需要「一份数据加上能对它做的事」时,再考虑 类;元组没有自定义的方法名,它只是轻量的成套数据。
和相近概念的差别
列表灵活,适合会增减的序列。元组克制,适合传递一份不该被改的结果。字符串也不可变,但它装的是字符;元组可以装任意类型的值。和 对象 相比,元组是一种内置的成套表示,而不是一份你自己画的图纸。
与字典的差别在于:元组靠位置,字典靠键。返回两个值却当一个数字用,是位置模型被读错,而不是「Python 返回了两次」。
常见误会
误会 1:圆括号创造了元组。
真正的标记是逗号。(3) 只是整数 3;(3,) 才是单元素元组。
误会 2:元组里绝对改不了任何东西。
若某一格是列表,列表内部仍可变。不可变指的是元组结构本身。
误会 3:返回了两个值,却只用一个名字去接,然后当数字用。
接住的是整个元组。要两个数,就解包,或用下标。
想知道更多
- 书:埃里克·马瑟斯《Python编程:从入门到实践(第3版)》
- 书:艾伦·唐尼《像计算机科学家一样思考Python(第2版)》
- 书:布鲁克希尔《计算机科学概论》
未登录时不会保存学习进度