简介
元组(tuple)也是Python中标准数据类型之一, 它与列表非常相似。主要的区别是:
- 元组使用
()
包含元素,可以是不同类型的数据; - 元组是不可更改的类型,这与字符串很像,因此可以存储一些重要的数据。
元组的定义
创建元组的方式也有两种:
直接创建:
1 2 3 |
>>>a = ((4, 4, 3), 'finthon', 8) >>>a ((4, 4, 3), 'finthon', 8) |
调用tuple()
函数:
1 2 3 4 |
>>>a = [1, 2, 3, 4] >>>b = tuple(a) >>>b (1, 2, 3, 4) |
访问元组中的值
元组也可以通过切片工具获取其中的值:
1 2 3 4 5 6 |
>>>a = ('welcome', 'to', 'finthon', '.com') >>>a[2] 'finthon' >>>a[2:] ('finthon', '.com') |
需要注意的是,当元组中只有一个元素时,需要加一个逗号,
在后面,才表示是元组类型:
1 2 3 4 5 6 7 |
>>>a = (520) >>>type(a) int >>>b = (520,) >>>type(b) tuple |
元组中的元素是不可更改的,因此不能通过赋值来改变。
元组运算
元组运算 | 描述 |
---|---|
len(tuple) | 返回元组的长度 |
max(tuple) | 返回元组中元素的最大值 |
min(tuple) | 返回元组中元素的最小值 |
tuple1+tuple2 | 元组元素相加 |
tuple1*3 | 元组元素相乘 |
x in tuple | 判断元素是否在元组中 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>>a = (7, 3, 4, 5, 1, 3, 8, 8, 7) >>>b = (1, 1, 0) >>>len(a) 9 >>>max(a) 8 >>>min(a) 1 >>>a + b (7, 3, 4, 5, 1, 3, 8, 8, 7, 1, 1, 0) >>>3 in a True |
元组不可变性及特例
我们反复强调了3种不可变的标准类型(数字,字符串和元组)。在这当中,元组的不可变性更具有意义。作为容量类型之一,元组可以存储不同的数据类型。以元组类型存储的数据可以防止别人随意篡改,因此常常用来保存比较重要的、不需要经常修改的数据。
但是元组真的不能修改吗,这里就有特例:
1 2 3 4 5 6 7 8 9 10 |
>>>a = ([1, 2], 4, 5) >>>id(a) 2120583745968 >>>a[0][0] = 2 >>>a ([2, 2], 4, 5) >>>id(a) 2120583745968 |
可以很清楚的看到元组a
中列表元素[1, 2]
中的值通过赋值改变了,整体上“改变”了元组,并且内存空间的地址没有发生变化。总结一下,当元组中存在可变的数据类型时,此时元组是可变的。
元组方法
元组的操作比列表少的多,凡是试图修改元组中元素的方法都不能用:
函数 | 描述 |
---|---|
tuple.count() | 统计某个元素在元组中出现的次数 |
tuple.index() | 从元组中找出某个值第一个匹配项的索引位置 |
代码演示:
1 2 3 4 5 6 |
>>>a = (5, 5, 1, 3, 4, 2) >>>a.count(5) 2 >>>a.index(5) 0 |
复制元组
通过赋值建立变量引用:
1 2 3 4 5 6 7 |
>>>a = (5, 2, 0) >>>b = a >>>id(a) #内存空间地址相同 2120581404040 >>>id(b) 2120581404040 |
通过切片操作:
1 2 3 4 5 6 7 |
>>>a = (5, 2, 0) >>>b = a[:] >>>id(a) #内存空间地址相同 2120581404360 >>>id(b) 2120581404360 |
需要注意的是,通过切片操作复制列表的时候,在内存空间中新建了地址,但是在元组中并没有新建地址。可以这样理解,因为元组的不可变性,相应的函数操作就很少,没必要搞得那么花里胡哨,只用同一个地址就可以。而列表操作性太强,通过新建内存地址能够给予其更多的操作空间。