python的元组(tuple
)和列表(list
)类似,是一个有序的列表,区别在于tuple
是不能修改的,其初始化方式如下:
>>> classmates = ('Michael', 'Bob', 'Tracy')
现在,classmates
这个tuple
不能变了,它也没有append()
,insert()
这样的方法。其他获取元素的方法和list
是一样的,你可以正常地使用classmates[0]
,classmates[-1]
,但不能赋值成另外的元素。
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
空tuple可以这么定义:
>>> t = ()
>>> t
()
要定义一个只有1个元素的tuple,如果你这么定义:
>>> t = (1)
>>> t
1
定义的不是tuple
,是1这个数!
这是因为括号()
既可以表示tuple
,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1
。
所以,只有1
个元素的tuple定义时必须加一个逗号,
,来消除歧义:
>>> t = (1,)
>>> t
(1,)
Python在显示只有1
个元素的tuple
时,也会加一个逗号,
,以免你误解成数学计算意义上的括号。
tuple
的定义还可以不用加括号,譬如如下:
>>> t='hello',
>>> len(t)
1
>>> t
('hello',)
>>> l='hello','word','aaa'
>>> len(l)
3
>>> l
('hello', 'word', 'aaa')
tuple
内部是可以包含tuple
或者其他譬如list
等,不同在于如内含list
,则这个list是可以被改变的;
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
原因在于在元组中,每个元素都有一个地址,而这个列表也是指向的一个地址,改变元素只是改变内容,但是元组t指定的列表的地址并未改变,如下所示:
改之前:
改之后:
参考资料:
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316724772904521142196b74a3f8abf93d8e97c6ee6000
http://www.runoob.com/manual/pythontutorial/docs/html/datastructures.html#tut-tuples