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