简介
Lists 和 tuples 是 Python 中最常用的两种数据结构,而 dictionary 是第三种。列表和图元有许多相似之处。
- 它们都是存储项目集合的序列数据类型。
- 它们可以存储任何数据类型的项目
- 而且任何项目都可以通过其索引来访问。
所以我们在这里要回答的问题是,它们有什么不同?如果这两者之间没有区别,我们为什么要有这两种类型?难道我们就不能拥有列表或图元吗?
在这篇文章中,我们将展示列表和图元之间有什么不同。
语法的区别
在 Python 中,列表和图元的声明方式是不同的。列表是用方括号[] 创建的,而图元是用小括号() 创建的。
tuple_names = ('Nicholas', 'Michelle', 'Alex')
list_names = ['Nicholas', 'Michelle', 'Alex']
print(tuple_names)
print(list_names)
这将导致
('Nicholas', 'Michelle', 'Alex')
['Nicholas', 'Michelle', 'Alex']
我们定义了一个名为tuple_names 的元组和一个名为list_names 的列表。在元组定义中,我们使用了小括号() 而在列表定义中,我们使用了方括号[] 。
Python 的type() 方法有助于轻松识别对象的类型。
print(type(tuple_names)) # <class 'tuple'>
print(type(list_names)) # <class 'list'>
可变的与不可变的
列表是可变的,而图元是不可变的,这标志着两者的关键区别。这意味着什么呢?
我们可以改变/修改一个列表的值,但我们不能改变/修改一个元组的值。
因为列表是可变的,所以我们不能用列表作为字典中的一个键。这是因为只有不可变的对象才能作为字典中的一个键。因此,如果需要,我们可以使用图元作为字典的键。
让我们看一看一个例子,它演示了列表和图元在不可变性方面的区别。让我们创建一个不同名称的列表。
names = ["Nicholas", "Michelle", "Alex"]
让我们看看如果我们试图将列表的第一个元素从Nicholas 改为Samuel 会发生什么。
names[0] = "Samuel"
**注意:**第一个元素的索引是0 。
现在,让我们显示列表的内容。
print(names)
这将打印出更新的列表。
['Samuel', 'Michelle', 'Alex']
如果我们试图用一个元组做同样的事情,会怎么样?首先,让我们创建一个元组。
names = ("Nicholas", "Michelle", "Alex")
现在让我们尝试把元组的第一个元素从Nicholas 改为Samuel 。
names[0] = "Samuel"
这将导致以下错误
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
names[0] = "Samuel"
TypeError: 'tuple' object does not support item assignment
我们得到一个错误,一个元组对象不支持项目分配。原因是一个元组对象在创建后不能被改变。
重复使用与复制
元组不能被复制。原因是元组是不可变的。如果你运行tuple(tuple_name) ,它将立即返回自己。
names = ('Nicholas', 'Michelle', 'Alex')
copy_names = tuple(names)
print(names is copy_names)
两者是一样的。
True
相比之下,list(list_name) 需要将所有数据复制到一个新的列表中。
names = ['Nicholas', 'Michelle', 'Alex']
copy_names = list(names)
print(names is copy_names)
由于names 和copy_names 不一样,结果是False 。
False
接下来,让我们讨论一下列表和元组在大小上有什么不同。
大小的不同
Python 以较低的开销为元组分配较大的内存块,因为它们是不可变的。另一方面,对于列表,Pythons 分配的内存块很小。在结束时,与列表相比,元组将拥有更小的内存。这使得当你有大量元素时,元组与列表相比,空间效率更高一些。
例如,让我们创建一个列表和一个包含相同元素的元组,比较两者的大小。
tuple_names = ('Nicholas', 'Michelle', 'Alex')
list_names = ['Nicholas', 'Michelle', 'Alex']
print(tuple_names.__sizeof__())
print(list_names.__sizeof__())
输出显示,列表的大小比元组大。
48
64
**注意:**显示的大小是以字节为单位的。
同质性与异质性的比较
元组通常用于存储异质元素,也就是属于不同数据类型的元素。另一方面,列表通常用于存储同质元素,即属于同一类型的元素。
**注意:**这只是一个语义上的区别。两种数据类型都是异质的,但惯例不同。你可以在元组中存储相同类型的元素,也可以在列表中存储不同类型的元素。
尽管列表中有字符串和数字的混合物,但下面的代码在运行时不会出现错误。
list_elements = ['Nicholas', 10, 'Alex']
tuple_elements = ('Nicholas', "Michelle", 'Alex')
可变长度与固定长度
图元有一个固定的长度,而列表有一个可变的长度。这意味着我们可以改变创建的列表的大小,但我们不能改变现有元组的大小。
list_names = ['Nicholas', 'Michelle', 'Alex']
list_names.append("Mercy")
print(list_names)
输出显示第四个名字已经被添加到列表中。
['Nicholas', 'Michelle', 'Alex', 'Mercy']
我们为此使用了 Python 的append() 方法。我们可以通过insert() 方法实现同样的效果。
list_names = ['Nicholas', 'Michelle', 'Alex']
list_names.insert(3, "Mercy")
print(list_names)
输出结果再次显示第四个元素已经被添加到列表中。
['Nicholas', 'Michelle', 'Alex', 'Mercy']
一个 Python元组并没有为我们提供改变其大小的方法。
结论
我们可以得出结论,尽管列表和元组都是 Python 中的数据结构,但两者之间有明显的区别,主要的区别是:列表是可变的,而元组是不可变的。列表有一个可变的大小,而图元有一个固定的大小。与对列表的操作相比,对图元组的操作可以更快执行。