【发布时间】:2010-09-05 08:15:21
【问题描述】:
在很多地方,(1,2,3)(一个元组)和[1,2,3](一个列表)可以互换使用。
我什么时候应该使用其中一种,为什么?
【问题讨论】:
在很多地方,(1,2,3)(一个元组)和[1,2,3](一个列表)可以互换使用。
我什么时候应该使用其中一种,为什么?
【问题讨论】:
来自Python FAQ:
列表和元组虽然在许多方面相似,但通常以根本不同的方式使用。元组可以被认为类似于 Pascal 记录或 C 结构;它们是相关数据的小集合,可能是不同类型的,作为一个组进行操作。例如,笛卡尔坐标适当地表示为两个或三个数字的元组。
另一方面,列表更像其他语言中的数组。它们倾向于持有不同数量的对象,所有这些对象都具有相同的类型并且被一个接一个地操作。
通常按照惯例,您不会仅仅根据其(不)可变性来选择列表或元组。您可以为完全不同的数据片段的小集合选择一个元组,其中成熟的类太重了,而为任何合理大小的集合选择一个列表,其中您有一组同质数据。
【讨论】:
列表[1,2,3] 是动态且灵活的,但这种灵活性是以速度为代价的。
元组(1,2,3) 是固定的(不可变的),因此速度更快。
【讨论】:
元组是创建复合数据类型的一种快速灵活的方式。 列表是对象列表的容器。
例如,您可以使用 List 来存储班级中学生详细信息的列表。
该列表中的每个学生详细信息可能是一个包含他们的卷号、姓名和考试成绩的 3 元组。
`[(1,'Mark',86),(2,'John',34)...]`
此外,由于元组是不可变的,它们可以用作字典中的键。
【讨论】:
([], 3) 是不可散列的; ("hi", 3) 是可散列的; ( ([], 3), 3) 不可散列; ( ((), 3), 3) 是可散列的。
元组的概念具有很强的表现力:
实际上,它们非常适合打包和解包值 (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) 是一个元组,一旦定义,就无法进行修改。
【讨论】:
每当我需要将一组项目传递给函数时,如果我希望函数不更改传入的值 - 我会使用元组。
否则,如果我想拥有改变值的功能,我使用列表。
如果您使用外部库并且需要将值列表传递给函数并且不确定数据的完整性,请使用元组。
【讨论】:
正如其他人所提到的,列表和元组都是可用于存储 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']
此处仅显示列表方法中的 'count' 和 'index'。
这是因为元组是不可变的,它们不支持任何修改。相反,它们在内部实现中更简单、更快捷。
【讨论】:
sorted(x for x in set(dir(list)).difference(dir(tuple)) if not x.startswith('_')) >>> ['append', 'clear', 'copy', 'extend', 'insert', 'pop', 'remove', 'reverse', 'sort']
【讨论】:
如果您能找到适用于元组的解决方案,请使用它们,因为它会强制保持不变性,从而使您走上更实用的道路。你几乎从不后悔走上了函数式/不可变的道路。
【讨论】:
[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)-元组 [1,2,3]-列表 列表是可变的,可以在其上执行各种操作,而元组是不可变的,不能扩展。一旦创建元组,我们就不能从元组中添加、删除或更新任何元素。
【讨论】:
a = (1,2,3) 是一个不可变的元组,这意味着您不能将任何内容添加到 a b = [1,2,3] 是 python 中的一个列表,它是不可变的,这意味着您可以对 'b' 进行更改,删除或添加数字。
【讨论】:
简单来说,列表是可变的,而元组不是。因此,如果您想修改程序中的元素,即添加、删除或更改元素,请使用列表。但是,如果你不希望 tat 发生,即,可能是为了在 for 循环中设置序列,等等。去一个元组
【讨论】:
(1,2,3) 是不可变的,因此您无法添加或更改其中一项。相比之下,[1,2,3] 是可变的,因此您可以添加或更改项目。
【讨论】: