《老鸟python 系列》视频上线了,全网稀缺资源,涵盖python人工智能教程,爬虫教程,web教程,数据分析教程以及界面库和服务器教程,以及各个方向的主流实用项目,手把手带你从零开始进阶高手之路!点击 链接 查看详情




tuple类型

阅读:227569950    分享到

在我们现实世界中,存在一些不变的数据,比如身份证号,学号等等, 在程序里我们可以用 list 来存储一个班级里面所有学生的学号, 但 list 本身可以修改成员值,有可能在我们程序中不小心修改了 list 成员值导致业务逻辑错误,但在语法上并不存在问题,给程序员排查问题带来困难, 所以用 list 来存储学号并不能很好的描述现实世界,Python 提供了 tuple(元组) 数据类型来更好的描述这种现实世界的问题。

tuple 与 list 类似,也是一种有序的集合,不同之处在于 tuple 中的成员是不可改变的(不能添加新成员,不能删除已有的成员,不能修改里面的成员值)。

tuple 定义

元组使用小括号,列表使用方括号,元组创建很简单,只需要在括号中添加成员, 并使用逗号隔开即可。

students_id = (1001, 1002, 1003)
print(students_id)

如果要定义一个空的 tuple,可以写成 ()。 如果要定义只有 1 个成员的 tuple,不能写成 (x) ,要写成 (x,),因为 () 不但可以定义 tuple 类型,也可以作为运算符,比如 (1) 可以认为是对整数 1 做 () 运算,因为 () 的运算符优先级最高,Python 解释器会把 (1) 看作为对 1 做 () 运算。

tupleone = ()    # 空的 tuple
print(tupleone)

tupletwo = (1,)  # 一个成员的 tuple
print(tupletwo)

tupletwo = (1)   # int 类型的 1
print(tupletwo)

tuple 里面的成员不可修改,所以它没有 append,insert 等可以修改集合成员的函数,其它获取成员的函数和 list 相似,因为 tuple 不可变,所以代码更安全。如果可以,能用 tuple 代替 list 就尽量用 tuple。

深度剖析 tuple 内存模型

tuple 不可改变 ,也就是说 tuple 在刚开始定义的时候, 里面的成员就确定了,我们不能修改,添加,删除 tuple 成员, 但是如果 tuple 里面某个成员本身是可以改变的类型(比如 list), 我们可以改变这个变量成员本身内的值,注意:我们并没有改变 tuple 的成员,我们修改的是 tuple 成员中的成员。

mytuple = ("Hello", 250, [1, 2, 3])
mytuple[2][0] = "Python"   # 可以
print(mytuple)

我们分析以上代码每一步在内存中是如何表示的,对于第一行代码 mytuple = ("Hello", 250, [1, 2, 3]) 的内存模型,如下图。

对于第二行代码 mytuple[2][0] = "Python" 的内存模型,如下图。

通过上面对那两句代码的内存模型的图解析,我们可以清晰的看到无论是原来的 tuple ("Hello", 250, [1, 2, 3]) 还是后面的 tuple ("Hello", 250, ["Python", 2, 3]),对于 tuple 本身的成员来说并没有变化,还是那些地址值,只是 tuple 的第二个成员 [1, 2, 3] 里面的成员发生了变化, 所以并没有违背 tuple 的规则(tuple 成员不可改变)。

tuple 里面的成员是用逗号隔开的,每个成员可以是任何数据类型,无论该成员多么复杂,对 tuple 来说只是一个成员。

mytuple = ("Hello", 250, [1, 2, 3])
print(len(mytuple))  # 3

本节重要知识点

tuple 里面有一个成员的定义方法。

弄明白 tuple 的内存模型。

作业

著名公司(某团)对于以下代码,运行一下看下结果,想想为什么?(答案参考高级运算符章节的身份运算符知识点)。

mytupleone = ("Hello", 250, (3, "byebye"))
mytupletwo = ("Hello", 250, (3, "byebye"))
print(mytupleone is mytupletwo)

mytuplethree = ("Hello", 250, (3, [1, 2, 3]))
mytuplefour = ("Hello", 250, (3, [1, 2, 3]))
print(mytuplethree is mytuplefour)

如果以上内容对您有帮助,请老板用微信扫一下赞赏码,赞赏后加微信号 birdpython 领取免费视频。


登录后评论

user_image
yyj
2020年8月4日 13:11 回复

mytupleone = ("Hello", 250, (3, "byebye"))

mytupletwo = ("Hello", 250, (3, "byebye"))

print(mytupleone is mytupletwo)

mytuplethree = ("Hello", 250, (3, [1, 2, 3]))

mytuplefour = ("Hello", 250, (3, [1, 2, 3]))

print(mytuplethree is mytuplefour)

运行结果:

True

False


user_image
芳草天
2020年8月3日 19:32 回复

True

False


user_image
火鸡味锅巴
2019年10月22日 04:41 回复

可变和不变,博主讲的很深刻,涨姿势了


user_image
一个人
2019年8月12日 05:42 回复

终于能感受到,什么时候应该用list,什么时候应该用tuple了,顿悟啊


user_image
写作之欲正在高涨
2019年5月21日 16:18 回复

元组嵌套列表,列表可变


user_image
LXYlovesTD
2019年2月27日 01:15 回复

博主讲解细致入微啊,好多东西,看了全明白了!


user_image
大蚂蚁
2018年6月4日 05:55 回复

创建元组时,还能不用圆括号呀。涨姿势了,谢谢博主!