协慌网

登录 贡献 社区

列表和元组之间有什么区别?

有什么不同?

元组 / 列表的优点 / 缺点是什么?

答案

除了元组是不可变的之外,还有一个语义上的区别应该指导它们的使用。元组是异构数据结构(即,它们的条目具有不同的含义),而列表是同构序列。 元组有结构,列表有顺序。

使用这种区别使代码更加明确和易懂。

一个例子是成对的页面和行号来引用书中的位置,例如:

my_location = (42, 11)  # page number, line number

然后,您可以将其用作字典中的键来存储位置注释。另一方面,列表可用于存储多个位置。当然,人们可能希望在列表中添加或删除位置,因此列表是可变的是有意义的。另一方面,在现有位置添加或删除项目没有意义 - 因此元组是不可变的。

在某些情况下,您可能希望更改现有位置元组中的项目,例如在遍历页面行时。但元组不变性迫使您为每个新值创建一个新的位置元组。这看起来很不方便,但使用这样的不可变数据是价值类型和函数式编程技术的基石,它们具有很大的优势。

关于这个问题有一些有趣的文章,例如“Python 元组不仅仅是常量列表”“理解 Python 中的元组与列表” 。官方 Python 文档也提到了这一点

“元组是不可变的,通常包含异构序列......”。

在像Haskell这样的静态类型语言中,元组中的值通常具有不同的类型,并且元组的长度必须是固定的。在列表中,值都具有相同的类型,并且长度不固定。所以差异非常明显。

最后在 Python 中有一个namedtuple ,这是有道理的,因为元组已经被认为具有结构。这强调了元组是类和实例的轻量级替代品的想法。

列表和元组之间的区别

  1. 文字

    someTuple = (1,2)
    someList  = [1,2]
  2. 尺寸

    a = tuple(range(1000))
    b = list(range(1000))
    
    a.__sizeof__() # 8024
    b.__sizeof__() # 9088

    由于元组操作的大小较小,它变得快一点,但在你拥有大量元素之前没有多少提及。

  3. 允许的操作

    b    = [1,2]   
    b[0] = 3       # [3, 2]
    
    a    = (1,2)
    a[0] = 3       # Error

    这也意味着您无法删除元素或对元组进行排序。但是,您可以向列表和元组添加新元素,唯一的区别是您将通过添加元素来更改元组的 id

    a     = (1,2)
    b     = [1,2]  
    
    id(a)          # 140230916716520
    id(b)          # 748527696
    
    a   += (3,)    # (1, 2, 3)
    b   += [3]     # [1, 2, 3]
    
    id(a)          # 140230916878160
    id(b)          # 748527696
  4. 用法

    由于列表是可变的,因此不能将其用作字典中的键,而可以使用元组。

    a    = (1,2)
    b    = [1,2] 
    
    c = {a: 1}     # OK
    c = {b: 1}     # Error
  5. 可清洗的元组是可以清洗而列表则不是。散列函数返回对象的散列值(如果有)。

    列表和元组的可用性。

如果你去散步,你可以在(x,y)元组的任何瞬间记下你的坐标。

如果您想记录您的旅程,您可以每隔几秒将您的位置附加到列表中。

但你不能反过来这样做。