什么是元组
另一种有序列表叫做元组tuple
。
tuple 和 list 很相似,但是 tuple 一旦创建就不能再修改。
元组使用小括号()
,列表使用中括号[]
。
元组和列表共同特性:
- 索引:使用方括号
[]
进行索引访问,如seq[0]
- 切片:使用方括号
[:]
进行切片,如:seq[2:7]
- 加:使用加号
+
进行序列拼贴,如:seq = seq1 + seq2
- 乘:使用乘号
*
进行序列重复,如:seq = tinySeq * 5
- 检查成员资格:使用
in
或not in
检查成员资格,如:e in seq
创建元组
只需要在括号中添加元素,并使用逗号隔开即可。
>>> t1 = (1, 2, 3)
>>> t1
(1, 2, 3)
>>> t2 = 1, 2, 3 #不使用括号也可以
>>> t2
(1, 2, 3)
创建空元组
>>> t3 = ()
>>> t3
()
创建一个元素元组
元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用:
>>> t4 = (10)
>>> type(t4) #不加逗号,类型为整型
<class 'int'>
>>> t4 = (10,)
>>> type(t4) #加上逗号,类型为元组
<class 'tuple'>
访问元组
可以使用索引下标来访问元组的值:
>>> t1
(1, 2, 4)
>>> t1[1]
2
>>> t1[0:2]
(1, 2)
修改元组
元组中的元素是不能被修改的,但是可以进行连接组合新的元组:
>>> t1
(1, 2, 4)
>>> t2
(1, 2, 3)
>>> t1[0] = 11 #不能修改元组值
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>>
>>> t1 + t2 #多个元组进行连接
(1, 2, 4, 1, 2, 3)
删除元组
元组中的值是不能被删除的,但是可以删除整个元组:
>>> t1
(1, 2, 4)
>>> del t1
“可变的” 元组
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
咦??这个 tuple 定义的时候有 3 个元素,分别是’a’,’b’和一个 list。不是说 tuple 一旦定义后就不可变了吗?怎么后来又变了?
别急,我们先看看定义的时候 tuple 包含的 3 个元素:
当我们把 list 的元素’A’和’B’修改为’X’和’Y’后,tuple 变为:
表面上看,tuple 的元素确实变了,但其实变的不是 tuple 的元素,而是 list 的元素,tuple 一开始指向的 list 并没有改成别的 list。
所以,tuple 所谓的 “不变” 是说,tuple 的每个元素,指向永远不变。即指向’a’,就不能改成指向’b’,指向一个 list,就不能改成指向其他对象,但指向的这个 list 本身是可变的!
理解了 “指向不变” 后,要创建一个内容也不变的 tuple 怎么做?那就必须保证 tuple 的每一个元素本身也不能变。