零基础入门学习Python(第2版)
上QQ阅读APP看书,第一时间看更新

5.2 元组:戴上了“枷锁”的列表

视频讲解

接下来介绍的是列表的“表亲”——元组。

元组和列表的最大区别是:元组只可读,不可写。也就是说,可以任意修改(插入/删除)列表中的元素,而对于元组来说这些操作是不行的,元组只可以被访问,不能被修改。

5.2.1 创建和访问一个元组

元组和列表,除了不可改变这个显著特征之外,还有一个明显的区别:创建列表用的是中括号,而创建元组大部分时候使用的是小括号:

     >>> tuple1 = (1, 2, 3, 4, 5, 6, 7, 8)
     >>> tuple1
     (1, 2, 3, 4, 5, 6, 7, 8)
     >>> type(tuple1)
     <class 'tuple'>

注意:

tuple即元组的意思。

访问元组的方式与列表无异,也是通过索引值访问一个或多个(切片)元素:

     >>> tuple1[1]
     2
     >>> tuple1[5:]
     (6, 7, 8)
     >>> tuple1[:5]
     (1, 2, 3, 4, 5)

复制一个元组,通常可以使用切片来实现:

     >>> tuple2 = tuple1[:]
     >>> tuple2
     (1, 2, 3, 4, 5, 6, 7, 8)

如果试图修改元组,那么抱歉,Python会很快通过报错来回应:

列表的标识符是中括号([]),那么元组的标识符号是什么呢?

小甲鱼相信90%的朋友都会不假思索地回答:小括号!是这样吗?不妨来做个实验:

     >>> tuple1 = (520)
     >>> type(tuple1)
     <class 'int'>

这里,type()函数告诉我们temp变量是int(整型)。

是的,小括号还有其他的功能,在这里它就被当作操作符使用了……所以,如果想要元组中只包含一个元素,可以在该元素后面添加一个逗号(,)来实现:

     >>> tuple1 = (520,)
     >>> type(tuple1)
     <class 'tuple'>

其实小括号也是可以不要的:

     >>> tuple2 = 520,
     >>> tuple1 == tuple2
     True
     >>> tuple3 = 1, 2, 3, 4, 5
     >>> type(tuple3)
     <class 'tuple'>

发现了吧?逗号(,)才是关键,小括号只是起到补充的作用。再举个例子来对比:

     >>> 8 * (8)
     64
     >>> 8 * (8,)
     (8, 8, 8, 8, 8, 8, 8, 8)

5.2.2 更新和删除元组

有的读者可能会说,刚才不是说“元组是板上钉钉不能修改的吗?”现在又来谈更新一个元组,小甲鱼你这不是自己自相矛盾吗?

大家不要激动……我们只是讨论一个相对灵活的做法,与元组的定义并不冲突。由于元组中的元素是不允许被修改的,但这并不妨碍我们创建一个新的同名元组:

这段代码其实是利用切片和拼接实现更新元组的目的,它并不是修改元组自身,而是耍了“狸猫换太子”的小手段。

下面代码可以证明小甲鱼所言非虚:

id()函数用于返回指定对象的唯一id值,这个id值可以理解为现实生活中的身份证,在同一生命周期中,Python确保每个对象的id值是唯一的。上面两个元组虽然都叫x_men,但是id值出卖了它们——两者并不是同一个对象。

5.1.4节介绍了三种方法删除列表里边的元素,但是由于元组具有不可以被修改的原则,所以删除元素的操作理论来说是不存在的。如果非要这么做,建议使用上面的技巧实现:

     >>> temp = temp[:2] + temp[3:]
     >>> x_men = x_men[:1] + x_men[2:]
     >>> x_men
     ('金刚狼', '暴风女', '火凤凰', '镭射眼')

删除整个元组,只需要使用del语句:

其实在日常开发中,很少使用del去删除整个元组,因为Python的垃圾回收机制会在某个对象不再被使用的时候自动进行清理。

最后小结一下哪些操作符可以使用在元组上,拼接操作符和重复操作符刚刚演示过了,关系操作符、逻辑操作符和成员关系操作符(in和not in)也可以直接应用在元组上,这与列表是一样的,大家自己实践一下就知道了。关于列表和元组,今后会谈得更多,目前,就先聊到这里。