4.1.2 元组的访问

元组中元素的值通过索引访问,索引是一对方括号中的数字,索引也称为“下标”。元组的访问格式如下。


tuple[n]

其中,tuple[n]表示访问元组的第n个元素,索引n的值可以为0、正整数或负整数。前面一节已经提到了元组的输出方法,例如:


print (tuple[1])

上面这行代码将输出字符串“banana”,print语句表示输出,tuple[1]表示访问tuple的第2个元素。

可以把元组理解为数组,使用C或Java语言编程的读者应该不会陌生,数组的下标是从0开始计数,而元组中元素的访问也符合这个规则。

元组创建后其内部元素的值不能被修改,如果修改元组中的某个元素,运行时将报错。例如:


tuple[0] = "a"

对tuple元组中第1个元素进行赋值,运行代码后错误信息如下:


TypeError: 'tuple' object does not support item assignment

可见,元组中的元素并不支持赋值操作。

注意 元组不能添加或删除任何元素。因此,元组不存在任何添加、删除元素的方法,元组也不存在任何其他方法。

元组的访问还有一些特殊的用法,这些用法对于获取元组的值非常方便,例如负数索引和分片索引。这两个特性是Python的特殊用法,C或Java语言并不支持。负数索引从元组的尾部开始计数,最尾端的元素索引表示“-1”,次尾端的元素索引表示“-2”,以此类推。图4-1演示了负数索引与元素的对应关系,tuple[-1]的值为value4,tuple[-2]的值为value3。

分片(slice)是元组的一个子集,分片是从第1个索引到第2个索引(不包含第2个索引所指向的元素)所指定的所有元素。分片索引可以为正数或负数,两个索引之间用冒号分隔。分片的格式如下所示:


tuple[m:n]

其中,m、n可以是0、正整数或负整数。

图4-2演示了分片索引与元素的对应关系,tuple[1:3]将返回(value2,value3,value4)。

图4-1 负数索引演示

图4-2 分片索引演示

下面【例4-1】这段代码将说明负数索引和分片索引的使用。

【例4-1.py】


01     tuple = ("apple", "banana", "grape", "orange")          # 定义元组
02     print (tuple[-1])                         # 分片,倒数第一个元素
03     print (tuple[-2])                         # 分片,倒数第二个元素
04     tuple2 = tuple[1:3]                   # 分片,第二个元素到第三个元素(不包括第四个)
05     tuple3 = tuple[0:-2]                   # 分片,从第一个元素到倒数第二个元素(不包括倒数第二个)
06     tuple4 = tuple[2:-2]                   # 分片,从第三个元素到倒数第二个元素(不包括倒数第二个)
07     print (tuple2)
08     print (tuple3)
09     print (tuple4)

【代码说明】

·元组的索引可以用负数表示,第2、3行代码将分别输出“orange”和“grap”。

·使用分片截取后,将得到一个新的元组。第4行到第6行代码分别创建了3个元组。

·tuple2输出结果:('banana','grape')

·tuple3输出结果:('apple','banana')

·tuple4输出结果:()

元组还可以由其他元组组成。例如,二元元组可以表示为:


tuple = (('t1', 't2'), ('t3', 't4'))

tuple是一个二元元组,该元组由('t1','t2')和('t3','t4')组成。

下面【例4-2】的代码说明了元组间的包含关系以及元组中元素的访问。

【例4-2.py】


01     fruit1 = ("apple", "banana")          # 定义fruit1元组
02     fruit2 = ("grape", "orange")          # 定义fruit2元组
03     tuple = (fruit1, fruit2)
04     print (tuple)
05     print ("tuple[0][1] =", tuple[0][1])
06     print ("tuple[1][1] =", tuple[1][1])
07     print ("tuple[1][1] =", tuple[1][2])

【代码说明】

·第3行代码创建了一个复合元组tuple,tuple由元组fruit1和fruit2组成。元组tuple的输出结果:


(('apple', 'banana'), ('grape', 'orange'))

·tuple[0][1]表示访问tuple元组中第1个元组的第2个元素,即fruit1元组中的第2个元素,可以把tuple理解为二维数组。tuple[0][1]输出结果:


tuple[0][1] = banana

·tuple[1][1]表示访问tuple元组中第2个元组的第2个元素,即fruit2元组中的第2个元素。tuple[1][1]输出结果:


tuple[1][1] = orange

·同理,tuple[1][2]将访问fruit2元组中的第3个元素,因为此元素不存在,元组的索引访问越界。运行后将输出如下错误信息:


IndexError: tuple index out of range

tuple元组的存储结构如图4-3所示。

图4-3 tuple元组的存储结构

创建元组的过程,Python称为“打包”。相反,元组也可以执行“解包”的操作。“解包”可以将包元组中的各个元素分别赋值给多个变量。这样,避免了使用循环遍历的方法获取每个元素的值,降低了代码的复杂性,使表达方式更自然。下面这个例子说明了元组“打包”和“解包”的过程。


01     #打包
02     tuple = ("apple", "banana", "grape", "orange")
03     #解包
04     a, b, c, d = tuple
05     print (a, b, c, d)

【代码说明】

·第2行代码创建了一个tuple元组,元组的创建即“打包”的过程。

·第4行代码使用了一个赋值操作,等号的右边是tuple元组,等号的左边有4个变量,元组tuple中的4个元素分别赋值给这4个变量。

·第5行代码输出4个变量的值,输出的结果如下:


apple banana grape orange