在许多地方, (1,2,3)
(元组)和[1,2,3]
(列表)可以互换使用。
我什么时候应该使用其中一个,为什么?
最后发布: 2008-08-05 07:18:55
在许多地方, (1,2,3)
(元组)和[1,2,3]
(列表)可以互换使用。
我什么时候应该使用其中一个,为什么?
从Python常见问题解答 :
列表和元组虽然在许多方面类似,但通常以基本不同的方式使用。 元组可以被认为类似于Pascal记录或C结构; 它们是相关数据的小集合,可以是作为一组操作的不同类型。 例如,笛卡尔坐标适当地表示为两个或三个数字的元组。
另一方面,列表更像是其他语言中的数组。 它们倾向于容纳不同数量的物体,所有这些物体具有相同的类型并且一个接一个地操作。
通常按照惯例,您不会仅根据其(im)可变性来选择列表或元组。 您可以为完全不同的数据的小集合选择一个元组,其中一个完整的类太重量级,以及一个具有同类数据集的任何合理大小的集合的列表。
列表[1,2,3]
是动态且灵活的,但灵活性是以速度成本实现的。
元组(1,2,3)
是固定的(不可变的),因此更快。
元组是一种快速\\灵活的方式来创建复合数据类型。 列表是对象列表的容器。
例如,您可以使用List来存储班级中学生详细信息的列表。
该列表中的每个学生详细信息可以是包含其卷号,名称和测试分数的3元组。
`[(1,'Mark',86),(2,'John',34)...]`
此外,因为元组是不可变的,所以它们可以用作字典中的键。
元组的概念具有高度表达性:
实际上,它们非常适合打包和解包值( x,y=coord
)。
结合字典(哈希表),它们允许映射形式,否则需要多级关联。 例如,考虑标记已找到(x,y)。
// PHP if (!isset($found[$x])) { $found[$x] = Array(); $found[$x][$y] = true; } else if (!isset($found[$x][$y])) { $found[$x][$y] = true; } # Python found[(x,y)] = True # parens added for clarity
列表应该与对其内容的操作期望一起使用(因此提及不变性)。 人们希望使用列表弹出,推送,拼接,切片,搜索,插入,插入等。
元组应该是对象的低级表示,其中进行简单的比较,或者诸如以可预测的方式提取第n个元素或n个元素的操作,例如先前给出的坐标示例。
最后,列表不可清除,因此使用字典(Perl中的哈希表,PHP中的关联数组)完成的映射类型必须使用元组完成。
这是一个简单的元组和字典示例,最后一起:
""" couple is a tuple of two people doesLike is a dictionary mapping couples to True or False """ couple = "john", "jane" doesLike = dict() doesLike[couple] = True doesLike["jane", "john"] = False # unrequited love :'(
[1, 2, 3]
是一个可以添加或删除项目的列表。
(1, 2, 3)
是一个元组,一旦定义,就不能进行修改。
每当我需要将一组项目传递给一个函数时,如果我希望函数不改变传入的值 - 我使用元组。
否则,如果我想要使用函数来改变值,我使用list。
总是如果您正在使用外部库并且需要将值列表传递给函数并且不确定数据的完整性,请使用元组。
打开一个控制台并运行python。 试试这个:
>>> list = [1, 2, 3]
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delsli
ce__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getit
em__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__',
'__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__r
educe__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__'
, '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__',
'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
正如您可能会看到最后一行列表中的最后一行有以下方法: 'append','count','extend','index','insert','pop','remove','reverse','sort “
现在尝试相同的元组:
>>> tuple = (1, 2, 3)
>>> dir(tuple)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__
format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__get
slice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__
lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__'
, '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
此处仅显示列表方法中的“count”和“index” 。
这是因为元组是不可变的,它们不支持任何修改。 相反,它们在内部实现中更简单,更快捷。
正如其他人所提到的,Lists和tuples都是可以用来存储python对象的容器。 列表是可扩展的,它们的内容可以通过赋值来改变,另一方面,元组是不可变的。
此外,列表不能用作字典中的键,而元组可以。
[1,2,3]
是一个清单。
(1,2,3)
是一个元组和不可变的。
(1,2,3)和[1,2,3]在稀有条件下可互换使用。
所以(1,2,3)是一个元组并且是不可变的。 您希望进行的任何更改都需要覆盖该对象。
[1,2,3]是一个列表,可以追加和删除元素。
列表具有比元组更多的功能。
如果你能找到一个与元组一起使用的解决方案,那就使用它们,因为它会强制不可变性,这会驱使你走上一条更具功能性的道路。 你几乎从不后悔走下功能/不可变的道路。
(1,2,3)
是一个元组,而[1,2,3]
是一个列表。 元组是不可变对象,而列表是可变的。
(1,2,3)
是一个元组, [1,2,3]
是一个列表。 您可以将两者中的任何一个表示数字序列,但请注意元组是不可变的,列表是可变的Python对象。
(1,2,3)-tuple [1,2,3] -list列表是可变的,可以执行各种操作,而元组是不可变的,不能扩展。我们不能添加,删除或更新元组中的任何元素它被创造了。