创建tuple
1 | t = ('Adam', 'Lisa', 'Bart') #使用()创建 |
创建tuple和创建list唯一不同之处是用( )替代了[ ]。
创建后元组t就不能改变了,不能向tuple中删除和添加元素。
获取tuple元素的方式和list是一样的,可以使用t[0],t[-1]等索引方式访问元素,但是不能赋值成别的元素,否则就会报错:
1 | t[0] = 'Paul' |
tuple和list一样,可以包含0个、1个和任意多个元素。
1 | # 包含0个元素的tuple,也就是空tuple |
上述包含一个元素1的元组输出内容为整数1,不是元组类型(1)。因为()既可以表示tuple,又可以作为括号表示运算时的优先级,结果(1)被Python解释器计算出结果1,导致我们得到的不是tuple,而是整数1。
正是因为用()定义单元素的tuple有歧义,所以Python规定,单元素tuple要多加一个逗号“,”,这样就避免了歧义:
1 | t = (1,) |
Python在打印单元素tuple时,也自动添加了一个“,”,为了更明确地表明这是一个tuple。多元素tuple加不加这个额外的“,”效果是一样的。
“可变”的tuple
1 | t = ('a', 'b', ['A', 'B']) |
注意到t有3个元素:'a','b'和一个list:['A', 'B']。list作为一个整体是tuple的第3个元素,可以通过t[2]拿到。
修改list的两个元素,再看tuple的内容:
1 | L[0] = 'X' |
不是说tuple一旦定义后就不可变了吗?怎么现在又变了?
定义的时候tuple包含的3个元素:
当把list的元素’A’和’B’修改为’X’和’Y’后,tuple变为:
表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但这里指向的list本身可变导致tuple“可变”。所以要创建一个内容不变的tuple必须保证tuple的每一个元素本身也不能变。