Python:(1,2,3)和之间有什么区别,我应该什么时候使用它们?
在许多地方, (1,2,3)
和[1,2,3]
可以互换使用。
我应该什么时候使用这个或那个,为什么?
从Python FAQ :
列表和元组虽然在许多方面都相似,但通常以完全不同的方式使用。 元组可以被认为与Pascallogging或C结构类似; 他们是相关数据的小集合,可能是不同types的集体操作。 例如,笛卡儿坐标适当地表示为两个或三个数字的元组。
另一方面,列表更像是其他语言的数组。 他们倾向于持有不同数量的对象,所有这些对象都是相同types的,并且一个接一个地进行操作。
一般来说,按照惯例,你不会select一个基于其(im)可变性的列表或元组。 你会select一个元组的完全不同的数据,其中一个成熟的类将是太重量级的小数据集合,并为任何合理的大小,如果你有一个同类的数据集收集列表。
列表[1,2,3]是dynamic的和灵活的,但是灵活性以速度成本。
元组(1,2,3)是固定的(不可变的),因此速度更快。
元组是创build复合数据types的一种快速\灵活的方法。 列表是对象列表的容器。
例如,您将使用一个List来存储一个class级中的学生详细信息列表。
该列表中的每个学生的详细信息可以是包含他们的卷号,姓名和考试分数的三元组。
`[(1,'Mark',86),(2,'John',34)...]`
另外,因为元组是不可变的,所以它们可以在字典中用作键。
元组的概念具有高度的expression性:
-
实际上,它们非常适合打包和解包值(
x,y=coord
)。 -
结合字典(散列表),它们允许映射的forms,否则将需要多层次的关联。 例如,考虑标记(x,y)已被find。
// 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
-
应该使用列表,期望对其内容进行操作(因此提到了不变性的各种提法)。 一个会想popup,推,拼接,切片,search,插入之前,插入之后,等一个列表。
-
元组应该是一个对象的低级表示,在这个对象中进行简单的比较,或者以可预测的方式提取第n个元素或n个元素,比如前面给出的坐标例子。
-
最后,列表不可散列,所以用字典(Perl中的散列表,PHP中的关联数组)必须用元组来完成映射的types。
下面是一个元组和词典的简单例子,最后一起:
""" 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 :'(
每当我需要传递一个项目的集合到一个函数,如果我想要的function不改变传入的值 – 我使用元组。
否则,如果我想具有更改值的function,我使用列表。
如果您使用外部库,并且需要将值列表传递给函数并且不确定数据的完整性,请使用元组。
[1,2,3]是可以添加或删除项目的列表。
(1,2,3)是一个定义了的元组,不能修改。
正如其他人所说,列表和元组都是可以用来存储python对象的容器。 列表是可扩展的,其内容可以通过赋值来改变,另一方面,元组是不可变的。
此外,列表不能用作字典中的键,而元组可以。
如果你可以find一个可以与元组协同工作的解决scheme,那就使用它们,因为它强制不变性,这种方式可以让你的function更强大。 你几乎不会后悔沿着function/不可改变的道路。
[1,2,3]
是一个列表。
(1,2,3)
是一个元组,是不可变的。
打开一个控制台并运行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” 。
这是因为元组是不可变的,他们不支持任何修改。 相反,他们在内部执行上更简单快捷。
(1,2,3)
是一个元组,而[1,2,3]
是一个列表。 元组是一个不可变的对象,而列表是可变的。
(1,2,3)
是一个元组, [1,2,3]
是一个列表。 你们两个中的任何一个代表数字序列,但要注意元组是不可变的,列表是可变的Python对象。
- 元组可能代表字典中的一个键,因为它是不可变的。
- 如果您有一组不需要随机访问的数据,请使用列表。