Python中列表和元组有什么区别

前言

说到Python的数据类型,列表和元祖看起来有些相似,都是用来存储元素数组的,但它们却有各自的特点和区别。我们需要熟悉它们的使用特点,在工作中才不会错误使用。今天就来说说Python中列表和元组的区别。

列表list

列表在工作中十分常用,我们用它来创建数组,操作数组。它是动态数组,动态体现在它的元素可变、长度也可随时变化。

举个例子:

>>> alist = [1,2,3,4,5]
>>> # 更新0下标的元素
>>> alist[0] = 666
>>> alist
[666, 2, 3, 4, 5]
>>> len(alist)
5
>>> 新增数据
>>> alist.append(6)
>>> alist
[666, 2, 3, 4, 5, 6]
>>> len(alist)
6

列表之所以允许更新容量,是因为底层支持了resize的操作。在我们创建一个长度为M的列表a后,当我们需要新增元素时,比如要新增2个元素,Python会这么做:

  1. python会创建一个新的列表b,容量会大于M+2,为后续列表的append预留空间;
  2. 旧列表a的数据复制到新列表b中;
  3. 旧列表a被销毁。

这种预留空间的设计,对于后续新增的操作非常有用,因为如果不预留空间,每次新增数据都得向计算机申请内存及旧列表数据的内存复制,这些动作频繁操作代价很大。

元组tuple

相比于列表,元组不是动态数组,它在创建之后,元素及长度都不能被更改了。

举例如下,当我们想修改元素时,会直接报错。

>>> t = (1,2,3,4,5)
>>> t[0] = 666
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

但元组支持合并2个元组,这个类似列表的resize动作。和列表的append不同,元组的合并复杂度是O(n),因为元组合并其实就是创建一个新的元组,即重新分配内存空间,将2个元组的内容都复制到这个新元组。

>>> t = (1,2,3,4,5)
>>> t1 = (6,7,8)
>>> t2 = t + t1
>>> t2
(1, 2, 3, 4, 5, 6, 7, 8)

列表和元组的区别总结

总结如下:

  1. 列表是动态数组,元素可变,长度也可变。
  2. 元组是静态数组,创建之后不可变。
  3. 元组在Python运行时缓存。

前2点前面已介绍,关于第三点,元组在Python运行时缓存,好处是我们在使用元组时,不需要像列表一样,创建需要去访问内核获取内存分配。这个在使用时速度会很快,不需要频繁的和内核交互。

小结

这篇主要介绍了Python列表和元组的区别。我们在使用时,如果是预设好的数组,需要保证不被篡改,那么就使用元组。而列表动态可变,实际项目中运用得更光。