【问题标题】:Rubyist in Pythonland: what is a real world example of a tuple? [duplicate]Pythonland 中的 Rubyist:元组的真实示例是什么? [复制]
【发布时间】:2012-08-10 20:28:37
【问题描述】:

可能重复:
Why do we need tuples in Python (or any immutable data type)?

我正在学习 Python,并且有 Ruby 方面的背景。从来没有元组,我无法想象我为什么需要它们,或者为什么 Python 如此依赖它们。

【问题讨论】:

  • 不是重复的。这会问“为什么不可变”,而这会问元组本身的基本性质和目的。
  • @IgnacioVazquez-Abrams:它以何种方式不涵盖相同的领域?基本上唯一相关的区别是元组是不可变的。此处的答案中是否有任何信息不会出现在其他问题中?
  • 如果您花时间学习一些函数式类型语言(Haskell、Ocaml 等)的基础知识,您会清楚地看到数组/列表和元组之间的概念差异。

标签: python ruby tuples


【解决方案1】:

棋盘上一个正方形的坐标是很好地使用元组的一个例子。我通常使用由元组索引的 Python dict 来实现多维数组,而不是 list-of-lists 或 numpy 或数组模块:

board = {}
board[ 3, 6 ] = "black queen"
board[ 0, 0 ] = "white king"

您不能使用可变的(如列表)作为字典键,因此您需要一个元组。

有时你会发现自己想要从一个函数返回多个值——一个表示成功或失败的布尔值加上一个描述失败模式的字符串,例如:

if trickyOperationSucceeds():
    return True,"Success!"
return False,"The tricky thing failed!"

这不是一个经常使用的模式,但有时它可以让你摆脱麻烦。您也可以在此处使用列表;只是按照惯例,您通常会改用元组。

在考虑如何表示必须一起传递的独立值时,元组、字典和类之间几乎是一个连续统一体。考虑三种表示复合回报的方式:

(False, "The tricky thing failed!")
{ "status": False, "message": "The tricky thing failed!" }
ResultObject( status=False, message="The tricky thing failed!" )

如果您的代码中只有一个地方执行此操作,则元组因其简洁而具有吸引力。如果您经常使用这种模式,并在不同模块之间来回传递这些结果对,您可能会“升级”到 dict,其中元素具有有意义的键。如果这些结果成为您软件设计的主要部分,您可能会再次将它们升级为对象类的实例。这是形式和易用性之间的平衡。

【讨论】:

    【解决方案2】:

    元组只是一个不可变的序列,因此您不能分配给元组的各个项目。一个示例可能是一组 x-y 坐标,例如 (5, 10), (-3, 20), (0, 0)。如果您需要更新其中一些坐标,您可以重新创建元组,例如

    coord = (5, 10)
    # Our thing moves
    newCoord = (coord[0] + dx, coord[1] + dy)
    

    【讨论】:

      【解决方案3】:

      元组应该用于异构数据;它是 C 的 struct 或 Pascal 的 record 的 Python 等价物。将元素附加到这种类型没有意义,因此不需要它是可变的。与用于同质数据的列表对比:

      people = [(u'Bob', 24), (u'Sally', 27)]
      polygon = [(1, 1), (2, 3), (0, 0)]
      

      【讨论】:

      • 列表绝对可以有异构数据。 ["Bob", 22, (23, 9)] 工作得很好。有什么区别?
      • @DavidRobinson:不同之处在于,迭代 那个 列表需要您以不同的方式对待每个元素,因此它的 Pythonic 程度略低。
      • 我仍然认为这不是问题的有效答案。这实际上是在说差异是一种风格问题,而不是你可以用一个元组做的事情(比如散列它),而用一个列表实际上是不可能的。如果我是 Python 新手,并且有人告诉我这是唯一的区别,那对我来说似乎也没有必要。
      • @David:这当然不是唯一的差异,而是最重要的差异之一,正如 Guido 在2003.
      • @DavidRobinson:Ignacio Vazquez-Abrams 在这里站稳脚跟。这是来自 Guido van Rossum 的direct quote:“元组用于异构数据,列表用于同类数据。元组不是只读列表。”另见Understanding tuples vs. lists in PythonPython Tuples are Not Just Constant Lists。他们都提出了相同的观点。
      猜你喜欢
      • 1970-01-01
      • 2021-08-13
      • 2018-10-26
      • 2010-11-03
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      相关资源
      最近更新 更多