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对象。

  • 元组可能代表字典中的一个键,因为它是不可变的。
  • 如果您有一组不需要随机访问的数据,请使用列表。