这周我们接着说python的数据类型,我们之前几周说了数字,字符串和列表数据类型,这篇我们说python中的元组和集合数据类型,让我们先从元组开始。
谈起元组,有了解的可能会觉得这个类型跟列表是非常相似的,操作方面也基本雷同,不过他们本质的区别是,元组是不可变数据类型,还记得我们之前提到过的字符串也是不可变数据类型吗?让我们再回顾下什么是不可变性,不可变性就是一旦一个对象被定义了,它的值就不能再本更新,除非是重新创建一个新的对象,那元组跟字符串的区别是,元组是一个容器对象,它可以包含一个或多个元素,基本特性我们 就介绍了这里,接下来我们看看具体的一些例子:
1、元组创建
1 2 3 4 5 6 |
>>> t = () >>> t () >>> t = (1,2,3) >>> t (1, 2, 3) |
这里第一行就创建了一个空的元组,然后创建了一个保护三个元素的元组,元组的创建在这里要注意一点,如果你的元组里只有一个元素,要采用元素后加一个逗号的方式来表示,这个叫单元素元组,直接用(元素)的方式是不行的,例子如下:
1 2 3 4 5 6 |
>>> t = ('a') >>> t 'a' >>> t = ('a',) >>> t ('a',) |
2、获取元组值
前面我们说过,元组的数据类型跟列表基本一样,它也支持切片,下标的方式去访问容器的值,例如:
1 2 3 4 5 6 7 8 9 10 11 |
>>> t = ('abc', 20, ['f','g']) >>> t ('abc', 20, ['f', 'g']) >>> t[0] 'abc' >>> t[2][0] 'f' >>> t[2][5] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range |
因为元组是容器类型,所以它也可以包含一个列表作为元素,访问值得时候可以通过切片方式访问其中的值,如果访问的值不存在就会显示超出索引范围的错误。
3、元组更新
前面提到过因为元组是不可变类型,前面平时我们切片的操作也只是读取,不能够进行值得替换,否则会报错。
1 2 3 4 5 6 |
>>> t[0] 'abc' >>> t[0] = 'bcd' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment |
如果要改变元组只能新创建一个新的对象:
1 2 3 4 5 6 7 8 9 |
>>> t ('abc', 20, ['f', 'g']) >>> id(t) 139702583814576 >>> t = ('abc', 20, ['f', 'g', 'h']) >>> t ('abc', 20, ['f', 'g', 'h']) >>> id(t) 139702583814096 |
通过id()函数就可以看出我们创建了一个新的对象,id()函数官方解释如下:
1 2 |
Return the “identity” of an object. This is an integer (or long integer) which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value. CPython implementation detail: This is the address of the object in memory. |
简单来说就是返回这个对象生命周期的一个唯一标示。
除了重新赋值,元组也支持“+”字符的操作,通过+字符可以把两个元组连接起来生成一个新的元组。
1 2 3 4 5 6 7 8 |
>>> t1 = ('xyz', 10) >>> t ('abc', 20, ['f', 'g', 'h']) >>> t1 ('xyz', 10) >>> t2 = t + t1 >>> t2 ('abc', 20, ['f', 'g', 'h'], 'xyz', 10) |
关于元组的元素更新,还有一个特别的地方,就是虽然元组是不可变类型,但它包含的元素如果是可变对象,就可以改变其中的值,假如一个元组中包含一个列表,那这个列表中的值是可以变化的。
1 2 3 4 5 6 7 |
>>> t2 ('abc', 20, ['f', 'g', 'h'], 'xyz', 10) >>> t2[2][1] 'g' >>> t2[2][1]='o' >>> t2 ('abc', 20, ['f', 'o', 'h'], 'xyz', 10) |
3、列表和元组互转
如果有一个列表要转成元组,可以直接通过tuple()函数操作,如果元组要转成列表可通过list()函数操作,有了这2个函数,这两个容器类型的数据结构转换非常 方便。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> t ('abc', 20, ['f', 'o', 'h']) >>> >>> list(t) ['abc', 20, ['f', 'o', 'h']] >>> tl = list(t) >>> tl ['abc', 20, ['f', 'o', 'h']] >>> >>> >>> t = tuple(tl) >>> t ('abc', 20, ['f', 'o', 'h']) |
除了这2个函数,还有一些常用的例如max(),min(),len()等函数。