Python中的列表与图元有什么不同?

249 阅读5分钟

简介

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)

由于namescopy_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 中的数据结构,但两者之间有明显的区别,主要的区别是:列表是可变的,而元组是不可变的。列表有一个可变的大小,而图元有一个固定的大小。与对列表的操作相比,对图元组的操作可以更快执行。