首页
学习
活动
专区
工具
TVP
发布

0基础学Python之十四:元组

Hi 大家好,我是王可乐。前面可乐花了三节课的时间给大家讲解了 Python 语言中一个功能非常强大的数据类型:列表。相信大家课后一定都自己动手实践过了吧?编写代码也是一个熟能生巧的过程,只要多练习,你会对各个知识点都有更加深刻的理解。

今天,可乐要给大家介绍一个新的数据类型。在正式开始之前,我们先来看这么一个场景:

假设我有一个列表,我想通过对这个列表简单的改动得到一个新的列表,同时我还想保持原始的列表不发生变化。我应该怎么做呢?

我想大家的直觉一定是:再建一个列表,然后在新列表里做操作。我们来看看是否能达到我们预期的效果。

明明是在修改 x2,为什么 x1 会变化?这里可乐要给大家讲一点关于数据存储的相关知识。

我们知道,在程序运行过程中,程序的数据是存在内存里的。我们可以把内存理解成一个存放数据的街道,在内存的世界里,我们通过街道门牌号,也就是地址来找到一份数据。程序执行过程中,要访问某个数据时,CPU 通过查询这份数据的地址来找到数据在内存中的位置,然后再执行读取操作。

可以这么简单理解,程序中的变量实际上保存的就是数据在内存中的地址。而我们的 x2 = x1 这个操作,实际上是把列表 x1 的存储地址赋值给了 x2。所以这两个变量指向的是同一个存储地址。这就解释了为什么,当 x2 指向的列表数据发生改变的时候,x1 也会发生改变

Python 提供了 id 这个内置函数来查看变量的存储地址,我们来试一下。

可以看到,内存中的地址是用一个数字来表示的。我们先不用管这个数字,大家可以看到 x1 和 x2 的内存地址是一样的。因此,修改 x2 地址上的列表,就等同于修改 x1 上的列表。

那么上面这个场景我们应该怎么来实现呢?我们可以用列表的 copy() 函数来复制一份列表到新的内存地址上,也可以利用列表的分片功能,像这样(边念边输入下面的代码)赋值 x2,它的存储位置就和 x1 不同了。大家可以自己动手实践一下。

从这个例子里大家可以看到,我们在写程序的过程中,会遇到各种各样的问题。有些隐藏地较深的问题,查起来会很费时间和精力。那么为了尽可能少地陷入这种境地之中,一个比较好的策略就是在写代码时做好限制,防止后续由于疏忽带来一些不容易发现的 Bug。比如上面这个例子,如果你希望 x1 中的数据是不能修改的,那你可以使用元组,而不是列表来存储这些数据。

元组(英文叫 Tuple),就是我们今天要讲的新的数据类型。它是一种“不能修改”的列表。这个数据类型的基本操作和列表类似,唯一的不同是,这个数据类型不能做任何修改,所有的修改都会引发系统报错。我们来看一下:

这样我们就定义了一个元组。可以看到,列表是用方括号包住的,而元组是用圆括号包住的。和列表一样,元组里可以包含多种类型的数据,甚至也可以包含列表和元组。

我们仍然可以用下标索引对列表元素进行访问,也可以用分片的方式来取出部分连续的元素,当然取出的元素仍然是元组。例如:

此外,我们也仍然能使用 max,min,sum 这些内置函数来对元组进行对应的操作,例如:

但是,如果你尝试对元组进行修改,Python 则会报错。例如,还是刚才的元组 y:

大家可以看到,如果你使用元组来保存数据,就不用再担心数据被不小心修改了。不过,我们说的元组中数据不能修改,只是元组中的元素值不能修改,如数字、字符串、内存地址等。

如果我们的元组中有一个元素是列表,我们只是不能把这个列表改为其他内存地址上的其他列表,但是我们还是可以修改这个列表内部的元素的,大家可以在自己的 Python Shell 里尝试一下哦。

元组虽然是不可变的,但是我们可以将元组变成列表,也可以将列表变成元组。例如,我们看下面的例子:

那么,为什么我们需要一个“不能修改的列表”呢?除了上面说到的原因,即不可修改的数据类型可以防止程序员疏忽造成的意外错误。另一个原因是,元组的运行效率比列表要高。例如:

这里,可乐用 import 语句引入了一个外部模块 timeit。大家暂时不需要对这个模块有太多理解,只要了解 timeit 模块中的 timeit() 函数,可以来评估 Python 语句的运行速度就可以了。我们来看一下:

默认情况下,timeit() 函数的原理是对传入的 Python 语句做一百万次执行操作,并记录所消耗的时间。大家可以看到,仅仅是初始化的语句,操作列表的耗时就接近元组的四倍。而事实上,元组在执行效率方面的优势,就是靠“不能修改”而得来的。

编程是一个不断选择,不断取舍的过程,在这个过程中你会遇到很多的问题,你也会有很多自己的思考。特别是,当你的学习深入,问出更多的为什么,并且找到答案时,你会发现自己的能力在不断提升。

所以,可乐希望大家能够多思考,多问为什么,也多自己动手寻找答案。这样,你的编程水平会飞速提高的。

好了,今天的课程我们讲了一个新的数据类型,元组。我们还聊到了 Python 语言中为什么会有这个数据类型的原因。希望大家课后能思考一下,元组适合利用在哪些实际的编程场景里。

今天的内容就是这么多了,记得关注我们的公众号“可乐编程”哦。如果你觉得课程内容比较有趣,请转发给你的朋友们,可乐感谢大家的支持,我们下次课再见!

往期课程:

《0基础学Python之十三:列表(下)》

《0基础学Python之十二:列表(中)》

《0基础学Python之十一:列表(上)》

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180416G1FRSP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券