列表和元组有什么区别?

新手上路,请多包涵

元组/列表之间有什么区别,它们的优点/缺点是什么?

原文由 Lucas Gabriel Sánchez 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 249
2 个回答

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

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

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

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

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

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

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

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

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

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

原文由 nikow 发布,翻译遵循 CC BY-SA 4.0 许可协议

列表和元组的区别

  1. 文字
   someTuple = (1,2)
   someList  = [1,2]

  1. 尺寸
   a = tuple(range(1000))
   b = list(range(1000))

   a.__sizeof__() # 8024
   b.__sizeof__() # 9088

由于元组操作的尺寸较小,它变得更快一些,但在您拥有大量元素之前,这没什么好说的。

  1. 允许的操作
   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

  1. 用法

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

    a    = (1,2)
   b    = [1,2]

   c = {a: 1}     # OK
   c = {b: 1}     # Error

原文由 Nikita 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题