在python中,方括号和括号括起来的列表有什么区别?

What's the difference between lists enclosed by square brackets and parentheses in Python?

1
2
3
4
5
6
>>> x=[1,2]
>>> x[1]
2
>>> x=(1,2)
>>> x[1]
2

它们都有效吗?出于某种原因,你更喜欢哪一个?


方括号是列表,而圆括号是元组。

列表是可变的,这意味着您可以更改其内容:

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

尽管元组不是:

1
2
3
4
5
6
7
>>> 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'

另一个主要区别是,元组是可散列的,这意味着您可以将它作为字典的键,以及其他东西。例如:

1
2
3
4
5
6
7
8
9
10
>>> 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'

注意,正如许多人所指出的,您可以将元组添加到一起。例如:

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

然而,这并不意味着元组是可变的。在上面的示例中,通过将两个元组作为参数添加到一起来构造新的元组。原始元组未被修改。要证明这一点,请考虑以下内容:

1
2
3
4
5
6
7
>>> x = (1,2)
>>> y = x
>>> x += (3,)
>>> x
(1, 2, 3)
>>> y
(1, 2)

然而,如果您要用一个列表构造这个相同的示例,那么y也将被更新:

1
2
3
4
5
6
7
>>> x = [1, 2]
>>> y = x
>>> x += [3]
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]


它们不是列表,而是列表和元组。您可以在Python教程中阅读关于元组的内容。虽然您可以改变列表,但对于元组来说这是不可能的。

1
2
3
4
5
6
7
8
9
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


一个有趣的区别:

1
2
3
4
5
6
7
8
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)


()所包围的逗号分隔的项是tuples,由[]所包围的项是lists。


第一个是列表,第二个是元组。列表是可变的,元组不是。

请看本教程的数据结构部分和文档的序列类型部分。


括号和括号不同的另一种方式是方括号可以描述列表理解,例如[x for x in y]

而相应的附加语法指定了一个元组生成器:(x for x in y)

你可以用:tuple(x for x in y)得到一个元组理解。

看:为什么在python中没有tuple理解?