到目前为止,您肯定知道如何处理列表,这是 Python 中最流行的集合。现在让我们发现一个同样有用的数据类型——元组。您应该记住,它们几乎与列表相同。使它们与众不同的是它们的不变性。
定义一个元组
由于元组无法更改,因此创建元组类似于打开一个固定大小的盒子,然后将几个值放入该盒子并密封。一旦盒子被密封,您就不能修改它的大小或内容。
使用一对括号来定义一个元组:
empty_tuple = ()
print(type(empty_tuple)) # <class 'tuple'>
空元组很容易创建。那么下面的例子出了什么问题呢?
not_a_tuple = ('cat')
print(not_a_tuple) # 'cat'
print(type(not_a_tuple)) # <class 'str'>
如您所见,我们创建的变量存储了一个字符串。实际上组成元组需要一个逗号,而不是括号。让我们修复这段代码:
now_a_tuple = ('cat',)
print(now_a_tuple) # ('cat',)
print(type(now_a_tuple)) # <class 'tuple'>
因此,在定义单例元组时始终使用逗号。事实上,即使你的元组包含多个元素,用逗号分隔项目就足够了:
weekend = 'Saturday', 'Sunday'
print(weekend) # ('Saturday', 'Sunday')
print(type(weekend)) # <class 'tuple'>
内置函数tuple()
将字符串、列表和其他可迭代对象转换为元组。使用此函数,您也可以创建一个空元组。
# another empty tuple
empty_tuple = tuple()
print(empty_tuple) # ()
print(type(empty_tuple)) # <class 'tuple'>
# a list turned into a tuple
bakers_dozen = tuple([12, 1])
print(bakers_dozen == (12, 1)) # True
# a tuple from a string
sound = tuple('meow')
print(sound) # ('m', 'e', 'o', 'w')
我们可以用元组做什么?
首先,让我们检查一下列表和元组的共同特征。
列表和元组都是有序的,也就是说,当将元素传递给这些容器时,您可以预期它们的顺序将保持不变。元组对存储在其中的数据的性质也无动于衷,因此您可以重复值或混合不同的数据类型:
tiny_tuple = (0, 1, 0, 'panda', 'sloth')
print(len(tiny_tuple)) # 5
print(tiny_tuple) # (0, 1, 0, 'panda', 'sloth')
就像列表一样,元组支持索引。不过要小心索引,如果你想在没有IndexErrors
.
empty_tuple = ()
print(empty_tuple[0]) # IndexError
numbers = (0, 1, 2)
print(numbers[0]) # 0
print(numbers[1]) # 1
print(numbers[2]) # 2
print(numbers[3]) # IndexError
元组的第一个显着特征在这里发挥作用。他们不支持的是item assignment。虽然您可以通过索引更改列表中引用此元素的元素,但元组并非如此:
# ex-capitals
capitals = ['Philadelphia', 'Rio de Janeiro', 'Saint Petersburg']
capitals[0] = 'Washington, D.C.'
capitals[1] = 'Brasília'
capitals[2] = 'Moscow'
print(capitals) # ['Washington, D.C.', 'Brasília', 'Moscow']
former_capitals = tuple(capitals)
former_capitals[0] = 'Washington, D.C.' # TypeError
在上面的示例中,我们尝试更新元组,但结果并不好。您不能将项目添加到元组或从那里删除(除非您删除整个元组)。然而,不变性有积极的一面。我们将在下一节讨论它。
不变性及其优点
这时候,你可能会想到一个问题:当我们有列表时为什么要使用元组?可以预见的是,所有答案都有助于不变性。让我们详细谈谈它的好处:
- 元组比列表更快,内存效率更高。每当您需要处理大量数据时,都应该考虑一下。如果您不打算修改数据,也许您应该决定使用元组。
- 元组可以用作字典键,而作为键的列表将导致
TypeError
. - 最后但同样重要的是,不可能意外更改存储在元组中的数据。对于某些任务,它可能被证明是一种安全而强大的解决方案。
概括
这些是 Python 中元组的基础知识。就像列表一样,元组是有序且可迭代的。与列表不同,它们是不可变的。