赞
踩
今天,我们开始学习Python中的另一种类型——tuple类型。tuple是另一种有序的列表,中文翻译为“ 元组 ”,tuple 和 list 非常类似,但是,tuple一旦创建完毕,就不能修改了。
我们同样的使用班级里同学的名字来创建tuple,用tuple表示如下:
mates = ('小明','小红','小黑','小白')
print(mates)
创建tuple和创建list唯一不同之处是用( )替代了[ ]。
现在,这个 mates 创建完之后就不能改变了,tuple没有 append()方法和remove()方法,也没有insert()方法和pop()方法。所以,新同学没法直接往 tuple 中添加,老同学想退出 tuple 也不行。
获取 tuple 元素的方式和 list 是一模一样的,我们可以正常使用 t[0],t[-1]等索引方式来访问元素,但是不能赋值成别的元素。
mates = ('小明','小红','小黑','小白')
print(mates[0])
print(mates)
测试如下:
倘若我们给tuple元素赋值成其他的元素,我们来看一下结果:
mates = ('小明','小红','小黑','小白')
mates[2]= '小蓝'
print(mates)
测试结果:
说明tuple类型中的元素一旦创建就不能再修改了。
其实tuple和list一样,可以包含 0 个、1个和任意多个元素。包含多个元素的 tuple,我们在上文已经创建过了。
那包含 0 个元素的 tuple,也就是空tuple,其实可以直接用 ()表示:
mates = ()
print(mates)
那我们来试试创建包含1个元素的 tuple 吧。
mates = ('小明')
print(mates)
测试结果:
输出结果好像哪里不对!mates的输出好像不是tuple类型的( ‘小明’ ) ,而是字符串 小明。那为什么会这样呢?
因为()既可以表示tuple,又可以作为括号表示运算时的优先级,mates = (‘小明’)被Python解释器看做了字符串以后输出也会截然不同,导致我们得到的不是tuple的输出,而是字符串 小明。
正是因为用( )定义单元素的tuple有歧义,所以 Python 规定,单元素 tuple 要多加一个逗号“,”,这样就避免了歧义:
mates = ('小明',)
print(mates)
测试结果:
因此Python在打印单元素tuple时,也自动添加了一个“,”,为了更明确地告诉你这是一个tuple类型。
而多元素的 tuple 加不加这个额外的“,”,效果其实是一样的:
mates = ('小明','小红','小黑','小白',)
print(mates)
测试结果如下:
前面我们看到了tuple一旦创建就不能修改。现在,我们来看一个“可以变化”的tuple:
mates = ('小明','小红',['小黑','小白'])
a = mates[2]
a[0] = '小蓝'
a[1] = '小绿'
print(mates)
测试结果如下:
我们会明显的发现mates里面的元素发生了替换,我们注意到 mates 中有 3 个元素:‘小明’,'小红’和一个list:[‘小黑’,‘小白’]。list作为一个整体是tuple的第3个元素。
list对象可以通过 mates[2] 来拿到,然后我们把list中的的两个元素改成为小黑和小白,就会出现测试中的结果。
但是不是说tuple一旦定义后就不可变了吗,为什么现在又变了呢?
别急,接下来我会使用图文来解释 刚才的过程:
当我们把list的元素’小黑’和’小白’修改为’小蓝’和’小绿’后,tuple变为:
从表面上看tuple的元素确实变了,但其实变的不是 tuple 中的元素,而是 list 中的元素。
tuple一开始指向的list并没有改成别的list,所以tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向’小明’,就不能改成指向’小红’,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。
思考下面例题:
定义了tuple:
t = (‘a’, ‘b’, [‘A’, ‘B’])
由于 t 包含一个list元素,导致tuple的内容是可变的。能否修改上述代码,让tuple内容不可变?
解答:[‘A’, ‘B’]是list类型,因此内容可变,但tuple类型的(‘A’, ‘B’)的内容是不可变的。
l = ('a', 'b', ['A', 'B'])
t = ('a', 'b', ('A', 'B'))
print(l)
print(t)
所以通过使用把tuple中的所有的 [ ] 改成 ( ) ,即可使tuple中的所有元素都可以真正的固定下来。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。