初学者经常会将元组(tuple)和列表(list)混淆,他们的形式看起来也有些接近,只是tuple用圆括号,而list使用方括号。
>>> t = (1, 1)
>>> l = [1, 1]
>>> type(t)
<type 'tuple'>
>>> type(l)
<type 'list'>
初始化
# 空元祖
>>> ()
()
#常规初始化
>>> (1, 2)
(1, 2)
#不用括号,直接逗号连接,也表示元组
>>> 1, 2
(1, 2)
这里需要注意的是单个元素元组的初始化,如果一个包含元素为数字1的元组,如果直接使用(1)来初始化,这种表示方法是错误的,python解析器会认为这是一个数字1。
>>> a = (1)
>>> type(a)
<type 'int'>
要表示单个元素的元组,只需要在元素后加上一个逗号即可,加不加括号都没关系。
>>> a = 1,
>>> type(a)
<type 'tuple'>
>>> b = ("s",)
>>> type(b)
<type 'tuple'>
常用操作
元组遍历
使用for语句进行元组遍历。
t = (5, 4, 3, 2, 1)
for i in t:
print i
元组分片
元组的分片还是元组。
>>> t = (5, 4, 3, 2, 1)
>>> t[0:1]
(5,)
元组相加
元组相加只能元组之间相加,其实就是在前一个元组后直接append另外的元组(这种解释是否正确?至少看结果是正确的,“不可变性”章节会细讲)。
>>> a = 1,
>>> b = 2,
>>> a + b
(1, 2)
元组比较
元组之间的比较,是将元组之间的元素逐一比较,有点类似于字符串的比较。如有tuple1何tuple2两个元组比较,其实是分别比较tuple1[index]和tuple2[index],index从0一直增加,直到比较结果不为相等,或者index到了某个元组的长度大小。
>>> a = (1, 2)
>>> b = (1, 2)
>>> a == b
True
>>> b = (1, 3)
>>> a < b
True
>>> b = (1, 2, 3)
>>> a < b
True
不可变性
元组的不可变性是指元组在初始化后,其值就不会再改变。那么,在“元组相加”章节的情况如何解释呢?a += b这样的操作,其实是新创建了一个元组,该元组的值就是a和b元组的所有数据,再讲该新元组赋值给a。也就是说,相加之前和之后的a元组是两个不同的对象。代码为证:
>>> a = 1,
>>> b = 2,
>>> id(a)
139943685752464
>>> a += b
>>> a
(1, 2)
>>> id(a)
139943685608800
如上代码,虽然,都是元组a,却完全是两个不同的对象。这点,和字符串也是非常相似。
与其他类型的相互转换
与字符串转换
>>> a = 1, 2
>>> s = str(a)
>>> s
'(1, 2)'
>>> tuple(s)
('(', '1', ',', ' ', '2', ')')
>>> tuple(eval(s))
(1, 2)
元组转字符串,直接使用str函数即可。但是,该字符串想再转回元组,而不能直接使用tuple函数,因为tuple函数的形参是一个列表list。所以上述代码中tuple(s),其实是先将s转成了列表,所以就会出现上面的问题。要想实现这样的转化,需要在字符串前加上eval函数
与列表转换
直接使用tuple函数和list函数即可。
>>> tuple([1, 2])
(1, 2)
>>> list((1, 2))
[1, 2]
元组的用处
不可变性
可以作为dict的键值
可以作为函数的返回值