- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
4.6 类似列表的类型:字符串和元组
列表并不是唯一表示序列值的数据类型。例如,字符串和列表实际上很相似,只要你认为字符串是单个文本字符的列表。对列表的许多操作,也可以作用于字符串:按下标取值、切片、用于for循环、用于len(),以及用于in和not in操作符。为了看到这种效果,在交互式环境中输入以下代码:
>>> name = 'Zophie' >>> name[0] 'Z' >>> name[-2] 'i' >>> name[0:4] 'Zoph' >>> 'Zo' in name True >>> 'z' in name False >>> 'p' not in name False >>> for i in name: print('* * * ' + i + ' * * *') * * * Z * * * * * * o * * * * * * p * * * * * * h * * * * * * i * * * * * * e * * *
4.6.1 可变和不可变数据类型
但列表和字符串在一个重要的方面是不同的。列表是“可变的”数据类型,它的值可以添加、删除或改变。但是,字符串是“不可变的”,它不能被更改。尝试对字符串中的一个字符重新赋值,将导致TypeError错误。在交互式环境中输入以下代码,你就会看到:
>>> name = 'Zophie a cat' >>> name[7] = 'the' Traceback (most recent call last): File "<pyshell#50>", line 1, in <module> name[7] = 'the' TypeError: 'str' object does not support item assignment
“改变”一个字符串的正确方式,是使用切片和连接。构造一个“新的”字符串,从老的字符串那里复制一些部分。在交互式环境中输入以下代码:
>>> name = 'Zophie a cat' >>> newName = name[0:7] + 'the' + name[8:12] >>> name 'Zophie a cat' >>> newName 'Zophie the cat'
我们用[0:7]和[8:12]来指那些不想替换的字符。请注意,原来的'Zophie a cat'字符串没有被修改,因为字符串是不可变的。尽管列表值是可变的,但下面代码中的第二行并没有修改列表eggs:
>>> eggs = [1, 2, 3] >>> eggs = [4, 5, 6] >>> eggs [4, 5, 6]
这里eggs中的列表值并没有改变,而是整个新的不同的列表值([4, 5, 6]),覆写了老的列表值。如图4-2所示。
图4-2 当eggs = [4, 5, 6]被执行时,eggs的内容被新的列表值取代
如果你确实希望修改eggs中原来的列表,让它包含[4, 5, 6],就要这样做:
>>> eggs = [1, 2, 3] >>> del eggs[2] >>> del eggs[1] >>> del eggs[0] >>> eggs.append(4) >>> eggs.append(5) >>> eggs.append(6) >>> eggs [4, 5, 6]
在第一个例子中,eggs最后的列表值与它开始的列表值是一样的。只是这个列表被改变了,而不是被覆写。图4-3展示了前面交互式脚本的例子中,前7行代码所做的7次改动。
图4-3 del语句和append()方法当场修改了同一个列表值
改变一个可变数据类型的值(就像前面例子中del语句和append()方法所做的事),当场改变了该值,因为该变量的值没有被一个新的列表值取代。
区分可变与不可变类型,似乎没有什么意义,但4.7.1节“传递引用”将解释,使用可变参数和不可变参数调用函数时产生的不同行为。首先,让我们来看看元组数据类型,它是列表数据类型的不可变形式。
4.6.2 元组数据类型
除了两个方面,“元组”数据类型几乎与列表数据类型一样。首先,元组输入时用圆括号(),而不是用方括号[]。例如,在交互式环境中输入以下代码:
>>> eggs = ('hello', 42, 0.5) >>> eggs[0] 'hello' >>> eggs[1:3] (42, 0.5) >>> len(eggs) 3
但元组与列表的主要区别还在于,元组像字符串一样,是不可变的。元组不能让它们的值被修改、添加或删除。在交互式环境中输入以下代码,注意TypeError出错信息:
>>> eggs = ('hello', 42, 0.5) >>> eggs[1] = 99 Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> eggs[1] = 99 TypeError: 'tuple' object does not support item assignment
如果元组中只有一个值,你可以在括号内该值的后面跟上一个逗号,表明这种情况。否则,Python将认为,你只是在一个普通括号内输入了一个值。逗号告诉Python,这是一个元组(不像其他编程语言,Python接受列表或元组中最后表项后面跟的逗号)。在交互式环境中,输入以下的type()函数调用,看看它们的区别:
>>> type(('hello',)) <class 'tuple'> >>> type(('hello')) <class 'str'>
你可以用元组告诉所有读代码的人,你不打算改变这个序列的值。如果需要一个永远不会改变的值的序列,就使用元组。使用元组而不是列表的第二个好处在于,因为它们是不可变的,它们的内容不会变化,Python可以实现一些优化,让使用元组的代码比使用列表的代码更快。
4.6.3 用list()和tuple()函数来转换类型
正如str(42)将返回'42',即整数42的字符串表示形式,函数list()和tuple()将返回传递给它们的值的列表和元组版本。在交互式环境中输入以下代码,注意返回值与传入值是不同的数据类型:
>>> tuple(['cat', 'dog', 5]) ('cat', 'dog', 5) >>> list(('cat', 'dog', 5)) ['cat', 'dog', 5] >>> list('hello') ['h', 'e', 'l', 'l', 'o']
如果需要元组值的一个可变版本,将元组转换成列表就很方便。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论