Python中方括号和圆括号包围的列表有什么区别?

213
>>> x=[1,2]
>>> x[1]
2
>>> x=(1,2)
>>> x[1]
2

它们都有效吗?有人更倾向于其中一个吗?


3
FYI:(i for i in ...)[i for i in ...] 之间有一个更深刻的区别。 - Rik Poggi
4
@RikPoggi,深刻的区别是什么?您能详细说明一下吗? - qazwsx
15
第一个是 生成器表达式,第二个是 列表推导式。你可以在这里找到一些信息:官方列表推导式教程PEP 289。还有一些关于操作系统的问题在这里:生成器表达式 vs. 列表推导式generator-comprehension - Rik Poggi
7个回答

327

方括号代表的是列表,圆括号代表的是元组

列表是可变的,也就是说你可以改变它的内容:

>>> x = [1,2]
>>> x.append(3)
>>> x
[1, 2, 3]

当元组不为真时:

>>> x = (1,2)
>>> x
(1, 2)
>>> x.append(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'

另一个主要区别是元组是可哈希的,这意味着你可以将其用作字典的键,以及其他用途。例如:

>>> x = (1,2)
>>> y = [1,2]
>>> z = {}
>>> z[x] = 3
>>> z
{(1, 2): 3}
>>> z[y] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
请注意,正如许多人指出的那样,你可以将元组相加。例如:
>>> x = (1,2)
>>> x += (3,)
>>> x
(1, 2, 3)

然而,这并不意味着元组是可变的。在上面的例子中,通过将两个元组作为参数相加构造了一个新的元组。原始元组没有被修改。为了证明这一点,考虑下面的示例:

>>> x = (1,2)
>>> y = x
>>> x += (3,)
>>> x
(1, 2, 3)
>>> y
(1, 2)

如果您使用列表构造相同的示例,y 也会被更新:

>>> x = [1, 2]
>>> y = x
>>> x += [3]
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]

2
好的、简单的示例可以列出差异。谢谢! - Dr. Essen
对于上述的 'y=x' 示例,现在列表和元组的行为方式相同(在Python3.8.5中已验证)。 - Youjun Hu

14

一个有趣的不同之处:

lst=[1]
print lst          // prints [1]
print type(lst)    // prints <type 'list'>

notATuple=(1)
print notATuple        // prints 1
print type(notATuple)  // prints <type 'int'>
                                         ^^ instead of tuple(expected)

即使元组只包含一个值,也必须在其中包含逗号。例如,(1,) 而不是 (1)


谢谢。这就是我要找的东西。我看到的代码有(list1 + list2 + list3),它返回了一个列表,而不是元组。 - Joshua Stafford

4

方括号和圆括号的另一个区别是,方括号可以描述一个列表推导,例如:[x for x in y]

相应的圆括号语法指定了一个元组生成器:(x for x in y)

您可以使用以下代码获取元组推导: tuple(x for x in y)

参见:为什么Python中没有元组推导?


4

它们不是列表,而是一个列表和一个元组。您可以在Python教程中了解有关元组的内容。虽然您可以改变列表,但无法对元组进行更改。

In [1]: x = (1, 2)

In [2]: x[0] = 3
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/user/<ipython console> in <module>()

TypeError: 'tuple' object does not support item assignment

2
第一个是列表,第二个是元组。列表是可变的,元组是不可变的。
请查看教程中的数据结构部分和文档中的序列类型部分。

2

用逗号分隔的项,用 () 括起来的是 元组,用 [] 括起来的是 列表


1
没有用“圆括号”括起来的列表,它们是元组!但你可能想表达正确的意思。:P - Gandaro
1
用括号()括起来的列表是元组。我有点困惑,它们是列表还是元组? - juliomalegria
1
@julio.alegria 我认为 @FlopCoder 想要表达的是: () 包围的是 tuple,而被 [] 包围的是 list - funroll

0

(感谢Robert的澄清,以下仅适用于使用列表推导式的情况:)

!另一个非常重要的区别是,使用圆括号将得到一个生成器,因此与方括号的列表相比,内存消耗要低得多,特别是当您处理大型列表时 - 生成器不仅会占用显著较少的内存,而且还需要更少的时间,因为您不需要预先构建列表中的对象。


你确定吗?你能[编辑]你的答案并解释更多为什么会有一个生成器吗?所有其他答案都说(...)是元组,而[...]是列表。据我所知,生成器是一个函数,但问题中有常量。 - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接