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)也可以直接应用在元组上,这与列表是一样的,大家自己实践一下就知道了。关于列表和元组,今后会谈得更多,目前,就先聊到这里。