关于python:Pythonland中的Rubyist:什么是元组的真实世界示例?

Rubyist in Pythonland: what is a real world example of a tuple?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why do we need tuples in Python (or any immutable data type)?

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


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

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

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

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

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

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

当考虑如何表示必须一起传递的独立值时,元组、dict和类之间几乎是连续的。考虑三种表示复合收益的方法:

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

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


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

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


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

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