python元组类型

元组类型简介

使用括号包围的数据结构是元组(tuple)。例如:html

>>> (1,2,3)
(1, 2, 3)

>>> T = (1,2,3,)
>>> T
(1, 2, 3)

元组和列表同样,都是容器型的数据结构,且都是序列,因此容器中的元素都是按照索引位置有序存放的。因此,能够进行索引取值、切片等序列通用操做。python

不一样的是,元组是不可变序列,没法原处修改,意味着修改元组必须建立新的元组对象。实际上元组的概念来源于数学,在关系型数据库中用来表示一行数据对象,而行数据对象是固定不变的完整、稳定结构,python的元组也同样隐含的是完整性、稳定性。数据库

不可变序列一样意味着可使用hash()内置函数进行hash,也就是说它是hashable的。数据结构

hashable的类型是稳定的数据,能够放在一些须要稳定结构的地方,好比Set、dict的key,它们内部都是经过hash后的数据存放的。hashable意味着不一样对象的hash值不一样。好比类的实例对象全都是不一样的,之因此不一样是由于它们默认就是hashable的,不一样对象的hash值不一样。函数

元组的结构

元组能够看做是不可变的列表。它们的结构很是相似,都是在容器中存放元素的引用地址。code

它的结构图以下:htm

这个结构图什么意思,这里再也不赘述,若有须要,参考我对列表的介绍文章。对象

由于元组是不可变对象,因此修改元组数据会报错。也就是说,元组中的保存的引用地址是不可变的。blog

>>> T = (1111,2222,3333,4444)

>>> T[0] = 11111
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

构造元组

直接使用括号包围元素便可,或者使用元组的构造函数tuple()将数据转换成元组。例如:索引

>>> (1,2,3,4)
(1, 2, 3, 4)

>>> tuple("abcdef")
('a', 'b', 'c', 'd', 'e', 'f')

>>> tuple([1,2,3,4])
(1, 2, 3, 4)

括号中能够加一个尾随逗号:

>>> 1
1

须要注意的是,python中不少地方隐式地自动构造元组。它的隐式构造规则是这样的:若是没有指定括号,又有多个值,那么就使用元组做为容器。

>>> 1,2
(1, 2)

再者,为了区分没有括号的元组和单个数据对象,能够在想要做为元组元素的数据后面加上逗号。例如:

>>> 1,     # 元组
(1,)
>>> (1,)   # 元组
(1,)

>>> 1      # 单个数据
1
>>> (1)    # 单个数据
1

元组中能够嵌套任意类型的数据对象:

>>> (1,2,(3,4))
(1, 2, (3, 4))

>>> (1,2,[3,4])
(1, 2, [3, 4])

操做元组

元组是不可变的序列。序列意味着它的元素是按索引位置有序的,序列的通用操做元组均可以使用,不可变序列意味着那些序列的修改行为都不能用,可是却可使用hash()内置函数对元组进行hash。

关于序列有哪些通用操做,哪些是不可变序列具备的操做,哪些是可变序列具备的操做,详细内容参见:Python中的序列操做

这里简单介绍一点基本操做。

元组支持+ *符号操做:

>>> T = (1,2,3,4)
>>> T1 = ('a','b','c')

>>> T + T1
(1, 2, 3, 4, 'a', 'b', 'c')

>>> (1,2) + tuple("34")
(1, 2, '3', '4')

>>> T * 2
(1, 2, 3, 4, 1, 2, 3, 4)
>>> 2 * T
(1, 2, 3, 4, 1, 2, 3, 4)

能够经过+=的方式进行二元赋值:

>>> T1 = (1,2,3)
>>> T2 = (4,5,6)

>>> T1 += T2
>>> T1
(1, 2, 3, 4, 5, 6)

元组是序列,序列类型的每一个元素都是按索引位置进行存放的,因此能够经过索引的方式取得元组中的各个元素,经过切片的方式取得子元组:

>>> T = (1,2,3,4,5)
>>> T[0]
1

>>> T[:3]
(1, 2, 3)
>>> T[:]
(1, 2, 3, 4, 5)
>>> T[2:-1]
(3, 4)

但不能赋值,由于元组是不可变对象。

>>> T = (1,2,3,4)
>>> T[0] = 11
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

由于元组是不可变对象,因此可使用hash()进行hash:

>>> hash(T)
-1883319094
>>> hash((1,2,3))
-378539185
>>> hash([1,2,3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

修改元组

由于元组是不可变对象,因此没有直接方法修改元组,只能经过其它手段根据原始元组间接地构造新元组。切片返回的元组也是一种修改方式。

另外,要修改元组,能够考虑将元组转换成可变的列表,修改以后再转换回元组。例如:

>>> t = ('a','b','c','d')
>>> tmp = list(t)
>>> tmp[2] = "cc"
>>> t = tuple(tmp)
>>> t
('a', 'b', 'cc', 'd')

或者,经过解析的方式构造新元组,但元组解析必须注意的是元组的括号特殊性,由于它会被看成表达式的包围括号,而不是元组的构造括号。因此,只能使用tuple()包围解析表达式。

>>> T = (1,2,3,4,5)
>>> tuple( i * 2 for i in T)
(2, 4, 6, 8, 10)

>>> ( i * 2 for i in T)  # 不是元组,而是表达式括号
<generator object <genexpr> at 0x03572150>
相关文章
相关标签/搜索