Python中列表和元组的区别(除了不可变性)?

8

我知道 Python 中列表和元组的主要区别是列表可变而元组不可变。除此之外,它们拥有不同的方法,但我对它们的了解很少。除了不可变性之外,在 Python 3 中使用元组与列表相比是否有任何优缺点?它们中有一个访问时间更快、占用更小内存或包含更多方法吗?它们的内部结构是否有所不同?或者元组只是一个不可变列表,没有其他特点吗?


可能是列表和元组有什么区别?的重复问题。 - Scransom
3个回答

7
无论是列表还是元组,它们的内部实现方式都是引用元素对象的数组。这样,两者都可以被索引,且每个元素所需的内存量相同。在内部,它们都是同质的(无类型的引用)。在逻辑上,它们都是异质的(自动解引用,类型绑定于目标对象)。
列表可以被修改,因此内部数组是动态数组。元组不能被修改,因此它只是一个固定大小的数组。从这个角度来看,元组更简单。
至于哪个更快或更慢,您可以使用timeit模块测量具体情况。
您应该意识到的事实是,元组仅就存储的引用数量和值而言是不可变的。如果(例如)使用列表作为元组元素之一,则可以更改列表内容。这样,逻辑上,元组内容不是常量(这样的元组不可散列)。
使用更适合特定目的的类型。没有严格的偏好。这取决于情况。

4

在两个上运行dir命令-方法列表有所不同(下面展示了pop)。 元组可能更快。

>>> alist = [1,2,3]
>>> atuple = (1,2,3)
>>> alist.pop()
3
>>> atuple.pop()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'pop'

'

append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort' 这些方法可以使用于列表,但不能用于元组——这是有道理的,因为元组是不可变的。

从哲学角度来看,有些人期望列表是同质的,而对元组则没有这种期望。

'

类型之间是否存在内部差异,例如结构或编码? - fouric
如果您指的是字符串编码,则与元组无关。编码只是将抽象字符串转换为具体字节序列的一种方式。当元组包含字符串元素时,字符串对象是在元组外创建的。元组元素仅引用该对象(未经类型化的引用)。这对于元组元素或列表元素都是相同的。 - pepr

2
在Python中,有两种数据结构:列表和元组。列表具有动态属性,而元组具有静态属性。
在其他语言中,列表的声明类似于数组。列表不必始终是同质的,这使其成为Python最有效的工具之一。列表是Python数据结构中用于一次存储多个数据的一种容器类型。列表是跟踪数据序列并对其进行迭代的好方法。
元组是一种序列数据形式,可以包含各种数据类型的元素,但它是不可变的。换句话说,元组是Python属性的逗号分隔列表。由于其静态存在,元组比数组更快。
以下是我整理出来的一些区别:
1. 列表是可变的 2. 元组是不可变的
列表 - 迭代的实现比较耗时。 元组 - 迭代的实现比较快速。
列表 - 列表在执行插入和删除等操作方面更好。 元组 - 元组数据类型适用于访问元素。
列表 - 列表占用更多内存。 元组 - 元组占用的内存比列表少。
列表 - 列表有几种内置方法。 元组 - 元组没有太多内置方法。
列表 - 更容易发生意外更改和错误。 元组 - 在元组中很难发生。
希望你能理解。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接