2012-04-02 27 views
7

我已经知道一段时间了,Python中的列表和元组之间的主要区别是列表是可变的,元组不是。除了这些以及可用的不同方法之外,我对列表和元组知之甚少。他们之间有没有其他区别?有没有任何优点/缺点(除了不可变性)在Python 3的列表中使用元组?是否有一个比另一个有更快的访问时间,或者有更小的内存大小,还是包含更多的方法?他们的内部结构有什么不同?或者是一个元组只是一个不可变的列表,仅此而已?在Python中列表和元组之间的区别(减去不变性)?

+0

可能的重复[有什么区别列表和元组?](http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples) – 2015-08-07 05:39:58

回答

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' 

“追加”,“计数”,“扩展”,“索引”,“插入”,“流行音乐”,“删除”,“反向”,“那种”全部供列表,而不是元组 - 这是有道理的,考虑到不变性的想法。

在哲学上,有些人期望列表是同质的,并没有对元组的期望。

+0

是否有任何内部的差异类型,如结构化或编码? – fouric 2012-04-03 21:43:58

+0

如果你的意思是字符串编码,那么它与元组无关。编码只是将抽象字符串转换为具体字节序列的一种方式。当元组包含一个字符串元素时,字符串对象在元组之外被创建。元组元素仅引用对象(无类型引用)。这与tuple元素或list元素相同。 – pepr 2012-04-24 11:29:03

相关问题