pyhton 里面的元组,其实本质还是列表,但是它有和列表不同,元组是被戴上了枷锁的列表。
元组和列表不同,主要在于元组里面的元素是不可改变的,而列表是可任意地插入、删除元素的。下面我们可以分别dir()方法下:
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> dir(tuple)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
相信大家看了后应该对列表和元组的区别有更加深刻的了解。
下面继续向大家介绍元组
首先,我们先来创建一个元组:
元组的创建和列表的创建不一样,列表的建立一定要用中括号[ ];而元组的创建可以有小括号,也可以没有,其创建的最重要的一点是要有逗号(,)。这点很重要,下面让我们来看看。
tuple1 = (1,4,5,2,7,9,8)
<pre name="code" class="python">tuple2 = 1,4,5,2,7,9,8
tuple1和tuple2都是合法的。但是呢?这里似乎看不出元组的最重要的特点是逗号啊,我们再来示范下,建立tuple3和tuple4:
tuple3 = (3)
tuple4 = (3,)
打印tuple3和tuple4
>>> print(tuple3)
3
>>> print(tuple4)
(3,)
注意到区别了没有,打印的tuple3显示的结果是3,是整值,没有括号;而打印的tuple4显示的结果是(3,)是有括号的。
如果这点缺乏说服力,可以调用type()方法
>>> type(tuple3)
<class 'int'>
>>> type(tuple4)
<class 'tuple'>
这里显示的是tuple3的类型是“int”,而tuple4的类型是“tuple”。
所以说,逗号是建立元组的最大特点。而列表的创建的最大特点是中括号 [ ]。当然,有小伙伴可能会说,那我要是创建一个空元组,那么根据列表的创建空列表的方法,可以这样创建啊
>>> tuple5 = ,
这种想法是错误的。python编译器会给出这样的错误:
SyntaxError: invalid syntax
创建完了元组,现在再来看看怎么访问元组的元素。
元组元素的访问是和列表的元素访问是一样的。
下面来访问tuple1中的元素
>>> tuple1[2]
5
看,是不是和列表的元素访问有相同的效果。
同时,列表中分片的方法同样也适合元组
由于在前面的文章中已经提到过分片,这里我就不在详细介绍分片,直接上代码吧。
>>> tuple1[1:4]
(4, 5, 2)
>>> tuple1[:4]
(1, 4, 5, 2)
>>> tuple1[1:]
(4, 5, 2, 7, 9, 8)
>>> tuple1[:]
(1, 4, 5, 2, 7, 9, 8)
好,下面让我们继续学习元组。
如果有下面的一组代码,大家想想打印的结果是什么?
<pre name="code" class="python">>>>3*(3) #这里也可以 >>> 3*tuple3 结果是一样的
嗯,结果是9。但是,要是这样呢?
>>>3*(3,) #这里也可以 >>> 3*tuple4 结果是一样的
打印的结果是:
(3, 3, 3)
嗯,没错。相信小伙伴们已经猜对了,第一个相当于整数的乘法,第二个得到的3个3的元组,这里乘号是重复符号
下面继续介绍元组的更新和删除。说这点之前,想问问大家一个问题:
tuple1[1] = 9
大家觉得这里会成功替换原元组的tuple[1]的元素4吗?来验证下:
>>> tuple1[1]=9
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
tuple1[1]=9
TypeError: 'tuple' object does not support item assignment
是的,程序在这里会报错,因为在开始的时候已经说了,元组创建后,ta的值就确定了,也就是说不能改变。
这里说的更新和上述的方法不一样的。元组的更新是用分片方式,上代码:
>>> tuple9 = ("桌子","椅子","书桌","饭桌 ")
创建好后,往元组中,往椅子后面增加一个元素“python”
>>> tuple9 = tuple9[:2]+("python",)+tuple9[2:] #注意:<span style="color:#ff0000;">这里的括号和逗号都是必须的</span>,否则编译器将会报错
>>> tuple9
('桌子', '椅子', 'python', '书桌', '饭桌 ')
现在已经成功把“python”这个元素加入到元组中了。这里需要大家注意的是,
("桌子","椅子","书桌","饭桌 ")元组是还存在的,只是tuple9这个标签已经不指向ta,而指向了('桌子', '椅子', 'python', '书桌', '饭桌 ')这个新的元组。但是,python里面有一个回收器,如果python的回收器观察到("桌子","椅子","书桌","饭桌 ")没有标签,就会将ta回收。
说完了元组的更新,再来说说元组的删除,注意,列表的3个删除的方法(大家还记得吗?不记得可以看看前面的文章)并不适用于元组。但元组怎么删除元素呢?我们还是利用分片的方法。
还是拿tuple9来说,删除该元组中的“书桌”,可以这样,
>>> tuple9
('桌子', '椅子', 'python', '书桌', '饭桌 ')
>>> tuple9 = tuple9[:3]+tuple9[4:]
>>> tuple9
('桌子', '椅子', 'python', '饭桌 ')
>>>
现在已经成功删除了。大家可以写写代码试试看。
当然,也可以del的方法(这个方法是删除整个元组的),不过不推荐大家使用(因为python里面有个回收机制,这点和Java差不多),不过还是可以给大家示范下:
>>> del tuple9
>>> tuple9
删除后打印,这里编译器会报错(因为整个元组已经被删除了,也就没有了元组tuple9了)
Traceback (most recent call last):
File "<pyshell#48>", line 1, in <module>
tuple9
NameError: name 'tuple9' is not defined
>>>
在这里,跟大家说下:关系操作符 in和 not in也可以用在元组中,逻辑操作符 and、 or同样可以。
好啦,今天的内容就讲到这啦。有不足之处还请大家多多请教。