
4.3 元组
元组(tuple)是Python中常用的线性数据结构。元组由不同的元素组成,每个元素可以存储不同类型的数据,如字符串、数字甚至元组。元组是“写保护”的,即元组创建后不能再做任何修改操作,元组通常代表一行数据。它和列表类似,都是线性数据结构大家庭的成员,只不过元组中的元素是不可修改的,而列表中的元素是可以修改的。元组的圆括号中的元素通过逗号来分割。
4.3.1 定义
元组和列表类似,都是有序的线性结构,用括号来表示,可以指定索引来获取元素。创建元组其实很简单,只要在某个值后面加上一个逗号“,”。
例4-2 元组的定义

创建元组时,最后一个逗号省略。根据type函数可以看到元组的类型是tuple。虽然只要在数据后面加上逗号“,”即可,不过通常加上括号( )让人一眼就看出这是个元组,例如(1,2,3)。这里再强调一下PEP 8规范,写代码要养成好习惯。
小白逆袭:单元素元组和空元组
注意,当元组只包含一个元素的时候,不能写成(elem)这样的形式,而是要写成“elem,”或者(elem,),如果元组为空,可以只写()。事实上,之前创建列表时,也都是省略了最后一个元素的逗号,如果在工作中见到元组或列表的最后有个逗号,也是很正常的。
4.3.2 元组的访问
前面说过列表和元组都属于线性结构大家庭,但是元组更像大哥,成熟稳重且一诺千金,这种优良品质非常适合用于存储在程序运行期间不会变化的数据集。有时希望某个函数不要修改传入的数据,就可以将数据放入元组中传入,因为元组无法修改。万一函数的使用者试图修改数据,那么执行就会抛错。
可以将元素拆解,单独访问元组的某个元素。
例4-3 单独访问元组

可以与for循环语句配合,遍历元组中的所有元素。
例4-4 遍历元组

元组要比列表更加轻量级一些,所以总体上来说,元组的性能速度要略优于列表。
4.3.3 修改tuple变量
虽然tuple元组无法修改,但是可以给存储元组的变量重新赋值。
例4-5 元组的重复定义

首先定义了一个元组(200,50),并将其元素逐个打印出来,接下来将一个新的元组(400,100)存储到变量dimension中,然后再重新输出打印。注意一点,其实这里修改的不是元组本身,修改的是变量的引用。
此外,还有一种变相的“修改”方法,那就是当两个元组“相加”的时候。
例4-6 元组的相加

元组的元素是不可以删除的,但是我们可以使用del语句来删除整个元组。
例4-7 删除元组

元组被删除后,再次打印变量会有异常信息出现。不过在实际开发中,del语句并不常用,因为Python自带的垃圾回收机制会自动销毁不用的元组。注意,并非所有的闲置元组都会被垃圾回收机制自动销毁,Python会进行判断和区别对待。
垃圾回收机制是指Python会在后台,对静态数据做一些资源缓存(resource caching)。通常来说,因为垃圾回收机制的存在,如果一些变量不被使用了,Python就会回收它们所占用的内存,返还给操作系统,以便其他变量或其他应用使用。但是对于一些静态变量,比如元组,如果它不被使用并且占用空间不大,Python会暂时缓存这部分内存。这样,下次我们再创建同样大小的元组时,Python就可以不用再向操作系统发出请求去寻找内存,而是直接分配之前缓存的内存空间,这样就能大大加快程序的运行速度,这种设计机制是合理的,值得我们在做项目的时候借鉴。