Python List Vs Tuple
本教程将研究列表和元组之间的主要差异以及如何处理这两种数据结构。
列表和元组是一种存储一个或多个对象或项的数据结构类型,按预定义的顺序存储。我们可以在列表或元组中包含任何数据类型的对象,包括由None关键字定义的空数据类型。
什么是列表?
在其他编程语言中,列表对象的声明类似于数组。列表不必始终是同质的,因此它们可以同时存储不同数据类型的项。这使得列表成为最有用的工具。列表是Python的一种容器数据结构,用于同时保存多个数据。当我们需要迭代一些元素并保留这些项时,列表很有用。
什么是元组?
元组是另一种用于存储许多不同数据类型的项的数据结构,但与可变的列表不同,元组是不可变的。换句话说,元组是由逗号分隔的项的集合。由于其静态结构,元组比列表更高效。
列表和元组之间的区别
在大多数情况下,列表和元组是等价的。然而,在本文中有一些重要的差异需要探讨。
列表和元组的语法差异
列表的语法与元组的语法不同。元组的项由括号或圆括号()括起来,而列表的项由方括号[]括起来。
示例代码
# Python code to show the difference between creating a list and a tuple
list_ = [4, 5, 7, 1, 7]
tuple_ = (4, 1, 8, 3, 9)
print("List is: ", list_)
print("Tuple is: ", tuple_)
输出:
List is: [4, 5, 7, 1, 7]
Tuple is: (4, 1, 8, 3, 9)
我们声明了一个名为list_的变量,其中包含从1到10的一定数量的整数。列表用方括号[]括起来。我们还创建了一个名为tuple_的变量,它保存了一定数量的整数。元组用大括号()括起来。Python中的type()方法返回传递给它的数据结构或对象的数据类型。
示例代码
# Code to print the data type of the data structure using the type() function
print( type(list_) )
print( type(tuple_) )
输出:
<class 'list'>
<class 'tuple'>
可变列表 vs 不可变元组
列表和元组之间的一个重要区别是,列表是可变的,而元组是不可变的。这到底意味着什么?这意味着列表的项可以被改变或修改,而元组的项不能被改变或修改。
我们不能使用列表作为字典的键,因为它是可变的。这是因为Python字典的键是不可变对象。因此,如果需要,可以使用元组作为字典的键。
让我们考虑一个示例,强调列表和元组在不可变性和可变性方面的区别。
示例代码
# Updating the element of list and tuple at a particular index
# creating a list and a tuple
list_ = ["Python", "Lists", "Tuples", "Differences"]
tuple_ = ("Python", "Lists", "Tuples", "Differences")
# modifying the last string in both data structures
list_[3] = "Mutable"
print( list_ )
try:
tuple_[3] = "Immutable"
print( tuple_ )
except TypeError:
print( "Tuples cannot be modified because they are immutable" )
输出:
['Python', 'Lists', 'Tuples', 'Mutable']
Tuples cannot be modified because they are immutable
我们在上述代码中修改了list_中索引3处的字符串,Python解释器在输出中更新了索引3的值。此外,我们尝试在try代码块中修改元组的最后一个索引,但由于抛出了一个错误,我们从except代码块中获得了输出。这是因为元组是不可变的,当尝试修改元组时,Python解释器会引发TypeError错误。
尺寸差异
由于元组是不可变的,Python会分配更大的内存块来减少开销。相反,对于列表,Python会分配较小的内存块。因此,元组的内存使用量会比列表少。如果我们有大量的项目,这使得元组比列表稍微更节省内存。
例如,考虑创建一个具有相同项的列表和元组,并比较它们的大小:
示例代码
# Code to show the difference in the size of a list and a tuple
#creating a list and a tuple
list_ = ["Python", "Lists", "Tuples", "Differences"]
tuple_ = ("Python", "Lists", "Tuples", "Differences")
# printing sizes
print("Size of tuple: ", tuple_.__sizeof__())
print("Size of list: ", list_.__sizeof__())
输出:
Size of tuple: 28
Size of list: 52
可用函数
元组比列表具有更少的内置函数。我们可以利用内置函数dir([对象]来访问列表和元组的所有相应方法。
示例代码
# printing directory of list
dir(list_)
输出:
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
示例代码
# Printing directory of a tuple
print( dir(tuple_), end = ", " )
输出:
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
正如我们可以观察到的那样,列表有比元组更多的方法。使用内置函数,我们可以执行插入和弹出操作,并从列表中删除和排序项目,而这些操作在元组中不可用。
元组和列表:主要相似之处
- 它们都保存了多个项目的集合,并且是异构数据类型,这意味着它们可以同时包含多种数据类型。
- 它们都是有序的,这意味着项目或对象以与它们放置的顺序相同的方式保持,直到手动更改。
- 因为它们都是顺序数据结构,所以我们可以遍历它们持有的对象;因此它们是可迭代的。
- 可以使用方括号[index]包围的整数索引来访问这两种数据类型的对象。