Python:(1,2,3)和[1,2,3]之间有什么区别,我什么时候应该使用它们?

时间:2008-08-05 07:18:56

标签: python list tuples

在许多地方,(1,2,3)(元组)和[1,2,3](列表)可以互换使用。

我应该何时使用其中一种,为什么?

17 个答案:

答案 0 :(得分:31)

来自Python FAQ

  

列表和元组虽然在许多方面类似,但通常以根本不同的方式使用。元组可以被认为类似于Pascal记录或C结构;它们是相关数据的小集合,可以是作为一组操作的不同类型。例如,笛卡尔坐标适当地表示为两个或三个数字的元组。

     另一方面,

列表更像是其他语言中的数组。它们倾向于容纳不同数量的物体,所有物体都具有相同的类型,并且逐个操作。

通常按照惯例,您不会仅根据其(im)可变性来选择列表或元组。你会选择一个完整不同的数据小集合的元组,其中一个完整的类太重量级,以及一个具有同类数据集的任何合理大小的集合列表。

答案 1 :(得分:19)

列表[1,2,3]是动态且灵活的,但这种灵活性需要加快成本。

元组(1,2,3)是固定的(不可变的)因此更快。

答案 2 :(得分:11)

元组是一种快速\灵活的方式来创建复合数据类型。 列表是对象列表的容器。

例如,您可以使用List来存储班级中学生详细信息的列表。

该列表中的每个学生详细信息可能是包含其卷号,姓名和测试分数的3元组。

`[(1,'Mark',86),(2,'John',34)...]`

此外,因为元组是不可变的,所以它们可以用作词典中的键。

答案 3 :(得分:7)

元组的概念具有高度表现力:

  • 实际上,它们非常适合打包和解包值(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 :'(
    

答案 4 :(得分:4)

[1, 2, 3]是一个可以添加或删除项目的列表 (1, 2, 3)是一个元组,一旦定义,就无法进行修改。

答案 5 :(得分:3)

每当我需要将一个项集合传递给一个函数时,如果我希望函数不改变传入的值 - 我使用元组。

否则如果我想要改变值的功能,我使用list。

总是如果您正在使用外部库并且需要将值列表传递给函数并且不确定数据的完整性,请使用元组。

答案 6 :(得分:2)

打开一个控制台并运行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']

此处仅显示列表方法中的'count'和'index'

这是因为元组是不可变的,它们不支持任何修改。相反,它们在内部实施中更简单,更快捷。

答案 7 :(得分:2)

正如其他人所提到的,Lists和tuples都是可以用来存储python对象的容器。列表是可扩展的,它们的内容可以通过赋值来改变,另一方面,元组是不可变的。

此外,列表不能用作字典中的键,而元组可以。

答案 8 :(得分:2)

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

答案 9 :(得分:1)

如果你能找到一个与元组一起使用的解决方案,那就使用它们,因为它会强制不可变性,这会驱使你走向更具功能性的路径。你几乎从不后悔走下功能/不可变的道路。

答案 10 :(得分:1)

[1,2,3]是一个列表。

(1,2,3)是一个元组并且是不可变的。

答案 11 :(得分:1)

(1,2,3)和[1,2,3]在稀有条件下可互换使用。

所以(1,2,3)是一个元组并且是不可变的。您希望进行的任何更改都需要覆盖该对象。

[1,2,3]是一个列表,可以追加和删除元素。

列表具有比元组更多的功能。

答案 12 :(得分:0)

(1,2,3)元组 [1,2,3]-清单 列表是可变的,可以执行各种操作,而元组是不可变的,无法扩展。一旦创建元组,我们就无法添加,删除或更新任何元素。

答案 13 :(得分:0)

简单来说,列表是可变的,而元组则不是。因此,如果要修改程序中的元素,即添加,删除或更改元素,请列出。但是,如果您不希望tat发生,即可能是为了在for循环中设置序列,等等。请选择一个元组

答案 14 :(得分:0)

(1,2,3)是一个元组,[1,2,3]是一个列表。您可以将两者中的任何一个表示数字序列,但请注意元组是不可变的,列表是可变的Python对象。

答案 15 :(得分:0)

a =(1,2,3)是一个不可变的元组,表示您不能在其中添加任何内容 b = [1,2,3]是python中的一个不可变列表,意味着您可以更改'b'或在其中添加或删除数字。

答案 16 :(得分:0)

(1,2,3)是一个元组,而[1,2,3]是一个列表。元组是不可变对象,而列表是可变的。