前言
回顾前面的几篇文章,我给大家讲了 Python 中简单的数据类型、列表的操作等等,今天给大家介绍一个新的数据存储结构——元组。
1. 元组的定义
元组看起来和列表很像,但使用圆括号 ()
而不是方括号 []
来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表一样。
举例说明,如果我们要存储一个矩形的长和宽,使用元组来存储的话,可以这样写:
rectangle = (200, 50)
print(rectangle[0])
print(rectangle[1])
我们首先定义了一个元素 rectangle
,接下来,我们分别打印该元组的各元素,访问元组中元素的语法与访问列表元素的语法相同。
运行这段代码,结果如图1-1:
看到这,聪明的你应该会产生这样一个疑惑:既然 Python 已经提供了列表如此好用的存储结构了,为了什么还要提供元组?
没错,元组和列表定义有细微的区别(一个用()
,一个用[]
),访问方式更是一模一样,咋看一下确实可以相互替代。
在这里我要重点强调下:列表中元素是可修改的,而元组中元素是不可修改的。
下面我们来尝试修改下元组中的元素,看看结果如何:
rectangle = (200, 50)
rectangle[0] = 100
我们只是想把矩形的长修改成 100,这在列表中很正常的操作,在元组中却报了错,报错内容如图1-2:
有些英文基础的同学应该能看懂:TypeError: 'tuple' object does not support item assignment
,意思是:元组不支持这种操作。
由此,我们应该能直观感受到了列表和元组的区别:列表非常适合用于存储在程序运行期间可能变化的数据集,因为列表是可以修改的。然而,有时你需要创建一系列不可修改的元素,这个时候元组可以满足需求。
2. 遍历元组
想列表一样,也可以使用for
循环来遍历元组中的所有值:
rectangle = (200, 50)
for value in rectangle:
print(value)
运行这段代码,结果如图2-1:
就像遍历列表一样,Python返回了元组中的所有值。
3. 修改元组变量
看到这里,就算是聪明的你可能也有点懵,明明前面我花了大力气又是举例又是总结的就是想告诉你们元组中元素不可修改,怎么到这节的大标题这么明目张胆地打脸。
虽然笔者是微胖界的翘楚,但自觉脸够大了,怎么可能做出前后自相矛盾的事情呢。
且看我怎么自圆其说!
前面我说的是元组中元素不可修改,这里说的是修改元组变量。
也就是说,一旦一个变量中确定存储了某个元组,那么这个元组结构中存放的元素是无法被修改的,但是我可以扔掉整个元组,换上另一个元组啊。
打个形象的比方,桌上有个鸡蛋篮子,你跟我说,篮子里的鸡蛋不能碰,好嘞,我不碰,但我可以把鸡蛋篮子换成水果篮子吧,这样我也没有碰鸡蛋篮子里的鸡蛋对不对。
那为什么会这样呢?元组中元素不可变,但保存元素的变量却可以改变。
请看图3-1:
rectangle
变量原本存储着 (200,50)
的地址,相当于有个指针,将 变量rectangle
指向数据 (200,50)
,但我们把鸡蛋篮子换成水果篮子的做法相等于改变了指针的指向,现在 rectangle
指向了数据 (300,100)
。
落实到代码上,实现就很简单了:
rectangle = (200, 50)
print("原矩形:")
for value in rectangle:
print(value)
rectangle = (300, 100)
print("现矩形:")
for value in rectangle:
print(value)
我们首先定义了一个元组,将其存储的矩形长宽打印了出来;
接下来,将一个新的元组存储到变量中;
然后,打印新的矩形长宽。
这次 Python 没有报错,因为给元组变量赋值是合法的。
运行结果如图3-2:
相比于列表,元组是更简单的数据结构。如果想存储一组值在程序的整个生命周期内都不变,可使用元组。
结尾语
如果你在学习过程中有任何疑问,可以关注文章下方↓↓↓的公众号及时与我联系,我们相互讨论,共同学习。
最后,祝你学有所成。