Python 列表与元组

在本教程中,我们将学习列表和元组之间的重要区别,以及它们在 Python 中如何发挥重要作用。

列表和元组用于顺序存储一个或多个 Python 对象或数据类型。两者都可以存储任何数据,如整数、浮点、字符串和字典。列表和元组在大多数因素上是相似的,但是在这里我们将描述它们之间的主要区别。

让我们讨论以下几点的主要区别。

代表性差异

列表和元组的表示略有不同。列表通常用方括号[]括起来,元素是逗号分隔的元素。元组用括号()括起来,元素用逗号分隔。括号是可选的,这些类型的元组被称为元组打包。

考虑下面的例子。


list1 = ['JavaTpoint', 1, 2, 54.30, {'Name: ''Peter'}]
print(type(list))
tuple1 = ('JavaTpoint',5,8,31.9,[1,2,3])
print(type(tuple1))

输出:

<class 'list'>
<class 'tuple'>

在上面的程序中,我们定义了一个 list1 变量,它保存了从索引 0 到 4 的不同数据类型的列表。我们定义了另一个变量 tuple1,,它包含不同数据类型的元组。它由()括起来。

可变列表和不可变元组

这是列表和元组之间最重要的区别,而列表是可变的,元组是不可变的。列表是可变的,这意味着 Python 对象在创建后可以修改,而元组在创建后不能修改。考虑给定的示例。


a = ["Peter","Joseph","Mathew","Ricky"]
print(a)

输出:

['Peter', 'Joseph', 'Mathew', 'Ricky']

现在我们将第 0 个索引元素“Peter”更改为“Samson”。


a[0] = "Samson"
print(a)

输出:

['Samson', 'Joseph', 'Mathew', 'Ricky']

现在我们创建一个元组并做同样的事情。


a = (10,20,"JavaTpoint",30,40)
print(a)

输出:

(10, 20, 'JavaTpoint', 30, 40)


a[0] = 50

输出:

TypeError Traceback (most recent call last)
<ipython-input-5-52b2981fae12> in <module>
----> 1 a[0] = 50

TypeError: 'tuple' object does not support item assignment

由于不变性,我们在更改元组的 1st 元素时出错。它不支持项目分配。

排除故障

由于元组的不变性,在大型项目中很容易调试。如果我们有一个小项目或较少数量的数据,那么列表就发挥了有效的作用。让我们考虑以下示例:


a = [6,9,4,3,7,0,1]
# Copying address of a in b
b = a
a[3] = "JavaToint"
print(a)

输出:

[6, 9, 4, 'JavaToint', 7, 0, 1]

在上面的代码中,我们做了b = a;这里我们没有将列表对象从 b 复制到 a。b指的是列表 a 的地址。这意味着如果我们在 b 中进行更改,那么它将反映与列表 a中相同的内容,这使得调试变得容易。但是对于 Python 对象可能有多个引用的重要项目来说,这很难。

跟踪列表中的那些变化会非常复杂,但是不可变的对象元组在创建后不能改变。

所以元组很容易调试。

功能支持

元组支持的操作比列表少。内置的 **dir(对象)**用于获取列表和元组支持的所有函数。

  • 列出功能


dir(list)

输出:

['__add__','__class__','__contains__','__delattr__','__delitem__','__dir_,
'__doc__','__eq__','__format__', '__get__','__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']

  • 元组函数


dir(tuple)

输出:

['__add__',
'__class__',
'__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']

内存高效

元组比列表更节省内存,因为元组的内置操作更少。列表适用于较少的元素,而元组对于大量数据来说比列表快一点。


Tuple = (1,2,3,4,5,6,7,8,9,0,5485,87525,955,3343,53234,6423,623456,234535)
List = [1,2,3,4,5,6,7,8,9,0,78,34,43,32,43,55,54,212,642,533,43434,54532 ]
print('Tuple size =', Tuple.__sizeof__()) # Tuple size = 52
print('List size =', List.__sizeof__())

输出:

Tuple size = 168
List size = 216

结论

  • 在某些情况下,列表可能比元组更有用。但是元组是 Python 的重要数据结构。元组通常用于不可更改的数据,或者我们可以说数据将在元组中被写保护。元组向 Python 解释器发送数据将来不应改变的指示。

  • 我们可以像使用字典一样使用元组,而不用使用键来存储数据。例如-


list1 = [(101, "Mike", 24),(102, 'Hussey', 26),(103, 'David', 27),(104, 'Warner', 29)]

  • 元组可以用于字典关键字,因为这些关键字是可哈希和不可变的,而列表不能在字典中使用关键字。


dict = {("Mike",22):24000} #valid dictionary
dict = {["Peter",26]:25000} #Invalid dictionary

原文:https://www.javatpoint.com/python-list-vs-tuple