返回介绍

4.6 类似列表的类型:字符串和元组

发布于 2024-01-22 21:44:07 字数 3677 浏览 0 评论 0 收藏 0

列表并不是唯一表示序列值的数据类型。例如,字符串和列表实际上很相似,只要你认为字符串是单个文本字符的列表。对列表的许多操作,也可以作用于字符串:按下标取值、切片、用于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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文