列表和元组有什么区别?

有什么不同?

元组/列表有什么优点/缺点?


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

使用这种区别使代码更加明确和易于理解。

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

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

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

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

在这个问题上有一些有趣的文章,例如“Python元组不仅仅是常量列表”或者“在Python中理解元组与列表”。 官方的Python文档也提到了这一点(“元组是不可变的,通常包含一个异构的序列......”)。

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

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


列表和元组之间的区别

  • 文字

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

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

    由于元组操作的规模较小,它会变得更快一些,但是除非您有大量元素,否则不会提及。

  • 允许的操作

    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
    
  • 用法

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

    a    = (1,2)
    b    = [1,2] 
    
    c = {a: 1}     # OK
    c = {b: 1}     # Error
    

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

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

    但是你不能以相反的方式去做。

    链接地址: http://www.djcxy.com/p/3855.html

    上一篇: What's the difference between lists and tuples?

    下一篇: How to merge two dictionaries with same key names