元组是 Python 中另一个重要的序列结构,和列表类似,也是由一系列按特定顺序排序的元素组成。和列表不同的是,列表可以任意操作元素,是可变序列;而元组是不可变序列,即元组中的元素不可以单独修改。
元组可以看做是不可变的列表。通常情况下,元组用于保存不可修改的内容。
从形式上看,元组的所有元素都放在一对小括号“()”中,相邻元素之间用逗号“,”分隔,如下所示:
(element1, element2, ... , elementn)
从存储内容上看,元组可以存储整数、实数、字符串、列表、元组等任何类型的数据,并且在同一个元组中,元素的类型可以不同,在这个元组中,有多种类型的数据,包括整形、字符串、列表、元组。例如:
("test.com.cn",1,[2,'a'],("abc",3.0))
需要额外注意的一点是,当创建的元组中只有一个元素时,此元组后面必须要加一个逗号“,”,否则 Python 解释器会将其误认为字符串。
[root@kube tuple]# cat demo1.py #coding:utf-8 a_tuple = (1,'a',[2,3],'test') #tuple 元组用小括号 () 括起来。里面包括数字,字符,列表 print(type(a_tuple)) b_tuple = ('a',) #如果元组就一个元素,那么需要末尾用 ,逗号结束,否则会认为是字符串。 print(type(b_tuple)) c_tuple = ('c') print(type(c_tuple)) a_list = [1,[2,"hi",4.3],'qaq'] d_tuple = tuple(a_list) #使用 tuple() 函数可以将列表转换为元组 print(type(d_tuple)) print(d_tuple[:2]) #可以用分片的方式获取元组数据
[root@kube tuple]# py demo1.py <class 'tuple'> <class 'tuple'> <class 'str'> <class 'tuple'> (1, [2, 'hi', 4.3]) [root@kube tuple]#
python 修改,删除元组元素
元组是不可变序列,元组中的元素不可以单独进行修改。但是,元组也不是完全不能修改
[root@kube tuple]# cat demo2.py #coding:utf-8 a_tuple = (1,'test',[2,3]) print(a_tuple) a_tuple = ("one",'test') #元组数据可以重新赋值 print(a_tuple) a_tuple = a_tuple + (1,'we') #通过+ 号对元组数据进行拼接 print(a_tuple) del a_tuple #del 删除元组数据 print(a_tuple) [root@kube tuple]# py demo2.py (1, 'test', [2, 3]) ('one', 'test') ('one', 'test', 1, 'we') Traceback (most recent call last): File "demo2.py", line 10, in <module> print(a_tuple) NameError: name 'a_tuple' is not defined [root@kube tuple]#
python 元组和列表的区别
组和列表最大的区别就是,列表中的元素可以进行任意修改,就好比是用铅笔在纸上写的字,写错了还可以擦除重写;而元组中的元素无法修改,除非将元组整体替换掉,就好比是用圆珠笔写的字,写了就擦不掉了,除非换一张纸。
可以理解为,tuple 元组是一个只读版本的 list 列表。
[root@kube tuple]# cat demo3.py listdemo = [] tupledemo = () print(listdemo.__sizeof__()) print(tupledemo.__sizeof__()) [root@kube tuple]# py demo3.py 40 24 [root@kube tuple]#
#事实上,就是由于列表是动态的,它需要存储指针来指向对应的元素(占用 8 个字节)。另外,由于列表中元素可变,所以需要额外存储已经分配的长度大小(占用 8 个字节)。但是对于元组,情况就不同了,元组长度大小固定,且存储元素不可变,所以存储空间也是固定的。
当然,如果你想要增加、删减或者改变元素,那么列表显然更优。因为对于元组来说,必须得通过新建一个元组来完成。
总的来说,元组确实没有列表那么多功能,但是元组依旧是很重要的序列类型之一,元组的不可替代性体现在以下这些场景中:
- 元组作为很多内置函数和序列类型方法的返回值存在,也就是说,在使用某些函数或者方法时,它的返回值会元组类型,因此你必须对元组进行处理。
- 元组比列表的访问和处理速度更快,因此,当需要对指定元素进行访问,且不涉及修改元素的操作时,建议使用元组。
- 元组可以在映射(和集合的成员)中当做“键”使用,而列表不行。