在许多地方,(1,2,3)
(元组)和[1,2,3]
(列表)可以互换使用。
我什么时候应该使用其中一种,为什么?
列表和元组虽然在许多方面相似,但通常以完全不同的方式使用。元组可以被认为类似于 Pascal 记录或 C 结构;它们是相关数据的小集合,可能是不同类型的,作为一个组进行操作。例如,笛卡尔坐标适当地表示为两个或三个数字的元组。
另一方面,列表更像其他语言中的数组。它们倾向于持有不同数量的对象,所有这些对象都具有相同的类型并且逐个操作。
通常按照惯例,您不会仅仅根据其(不)可变性来选择列表或元组。你会为完全不同的数据片段的小集合选择一个元组,其中一个成熟的类太重了,而一个任何合理大小的集合的列表,你有一个同质的数据集。
该列表[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 对象的容器。列表是可扩展的,它们的内容可以通过赋值来改变,另一方面,元组是不可变的。
此外,列表不能用作字典中的键,而元组可以。
打开控制台并运行 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']
此处仅显示列表方法中的“计数”和“索引”。
这是因为元组是不可变的,它们不支持任何修改。相反,它们在内部实现中更简单、更快。
如果您能找到适用于元组的解决方案,请使用它们,因为它强制不变性,这会驱使您走上更实用的道路。你几乎从不后悔走功能/不可变的道路。
[1,2,3]
是一个列表。
(1,2,3)
是一个元组且不可变。
(1,2,3) 和 [1,2,3] 在极少数情况下可以互换使用。
所以 (1,2,3) 是一个元组并且是不可变的。您希望进行的任何更改都需要覆盖该对象。
[1,2,3] 是一个列表,可以添加和删除元素。
List 比元组具有更多的功能。
(1,2,3)
是一个元组,[1,2,3]
而是一个列表。元组是不可变的对象,而列表是可变的。
(1,2,3)
是一个元组,[1,2,3]
是一个列表。两者中的任何一个都表示数字序列,但请注意元组是不可变的,而列表是可变的 Python 对象。
(1,2,3)-tuple [1,2,3]-list 列表是可变的,可以在其上执行各种操作,而 tuples 是不可变的,无法扩展。我们不能从 tuple 中添加、删除或更新任何元素一次它被创建。
a = (1,2,3) 是一个元组,它是不可变的,这意味着您不能将任何内容添加到 a b = [1,2,3] 是 python 中的一个列表,它是不可变的,这意味着您可以对 'b' 进行更改删除或添加数字。
简单来说,列表是可变的,而元组不是。因此,如果您想修改程序中的元素,即添加、删除或更改元素,请使用列表。但是,如果你不希望 tat 发生,可能是为了在 for 循环中设置序列等。去一个元组
(1,2,3)
是不可变的,因此您无法添加或更改其中一项。相反,[1,2,3]
它是可变的,因此您可以添加或更改项目。