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

nodio 发布于 2018-02-08 list 最后更新 2018-02-08 01:09 498 浏览

在许多地方,(1,2,3)[1,2,3]可以互换使用。 我应该什么时候使用这个或那个,为什么?

已邀请:

yeum

赞同来自:

列表[1,2,3]是动态的和灵活的,但是灵活性以速度成本。 元组(1,2,3)是固定的(不可变的),因此速度更快。

tet

赞同来自:

来自Python FAQ

Lists and tuples, while similar in many respects, are generally used in fundamentally different ways. Tuples can be thought of as being similar to Pascal records or C structs; they're small collections of related data which may be of different types which are operated on as a group. For example, a Cartesian coordinate is appropriately represented as a tuple of two or three numbers. Lists, on the other hand, are more like arrays in other languages. They tend to hold a varying number of objects all of which have the same type and which are operated on one-by-one.
一般来说,按照惯例,你不会选择一个基于其(im)可变性的列表或元组。你会选择一个元组的完全不同的数据,其中一个成熟的类将是太重量级的小数据集合,并为任何合理的大小,如果你有一个同类的数据集收集列表。

hhic

赞同来自:

元组是创建复合数据类型的一种快速\灵活的方式。 列表是对象列表的容器。 例如,您将使用一个List来存储一个班级中的学生详细信息列表。 该列表中的每个学生的详细信息可以是包含他们的卷号,姓名和考试分数的三元组。

 `[(1,'Mark',86),(2,'John',34)...]`
另外,因为元组是不可变的,所以它们可以在字典中用作键。

modit

赞同来自:

正如其他人所说,列表和元组都是可以用来存储python对象的容器。列表是可扩展的,其内容可以通过赋值来改变,另一方面,元组是不可变的。 此外,列表不能用作字典中的键,而元组可以。

tqui

赞同来自:

如果你可以找到一个可以与元组协同工作的解决方案,那就使用它,因为它强制不变性,这种方式会让你的功能更强大。你几乎不会后悔沿着功能/不可改变的道路。

et_et

赞同来自:

每当我需要传递一个项目的集合到一个函数,如果我想要的功能不改变传入的值 - 我使用元组。 否则,如果我想具有更改值的功能,我使用列表。 如果您使用外部库,并且需要将值列表传递给函数并且不确定数据的完整性,请使用元组。

svelit

赞同来自:

元组的概念具有高度的表达性:

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

funde

赞同来自:

[1,2,3]是可以添加或删除项目的列表 (1,2,3)是一个定义了的元组,不能修改。

ysunt

赞同来自:

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

psed

赞同来自:

打开一个控制台并运行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'出现在这里。 这是因为元组是不可变的,他们不支持任何修改。相反,他们在内部执行上更简单快捷。

yautem

赞同来自:

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

stotam

赞同来自:

(1,2,3)是一个元组,[1,2,3]是一个列表。你们两个中的任何一个代表数字序列,但要注意元组是不可变的,列表是可变的Python对象。

wnatus

赞同来自:

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