Python:(1,2,3) 和 [1,2,3] 之间有什么区别,什么时候应该使用它们?
题
在很多地方, (1,2,3)
(一个元组)和 [1,2,3]
(列表)可以互换使用。
我什么时候应该使用其中之一,为什么?
解决方案
来自 Python常见问题解答:
列表和元组虽然在许多方面相似,但通常以根本不同的方式使用。元组可以被认为类似于 Pascal 记录或 C 结构;它们是相关数据的小集合,这些数据可能属于不同类型,并且作为一个组进行操作。例如,笛卡尔坐标适当地表示为两个或三个数字的元组。
另一方面,列表更像其他语言中的数组。它们倾向于持有不同数量的对象,所有这些对象都具有相同的类型并且被一一操作。
一般来说,按照惯例,您不会仅根据其(不)可变性来选择列表或元组。您可以为完全不同的数据片段的小集合选择一个元组,其中成熟的类将过于重量级,并且为具有同质数据集的任何合理大小的集合选择一个列表。
其他提示
列表 [1,2,3]
是动态和灵活的,但这种灵活性是以速度为代价的。
元组 (1,2,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 对象的容器。列表是可扩展的,它们的内容可以通过赋值来更改,而元组是不可变的。
此外,列表不能用作字典中的键,而元组可以。
打开控制台并运行 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']
正如您可能看到的最后一行列表中的最后一个有以下方法:'追加'、'计数'、'扩展'、'索引'、'插入'、'弹出'、'删除'、'反向'、'排序'
现在对元组尝试同样的操作:
>>> 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']
仅有的 “计数”和“索引” 来自列表方法出现在此处。
这是因为元组是不可变的并且不支持任何修改。相反,它们的内部实现更简单、更快。
- 元组可能代表字典中的钥匙,因为它是不变的。
- 如果您有不需要随机访问的数据集合,请使用列表。
如果您能找到适用于元组的解决方案,请使用它们,因为它会强制不变性,从而推动您走上一条更实用的道路。你几乎永远不会后悔走上函数/不可变的道路。
[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] - 列表列表是可变的,可以在该列表上执行各种操作,而元组是不可分割的。它是创建的。