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) |
然而,如果您要用一个列表构造这个相同的示例,那么
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) |
逗号必须包含在元组中,即使它只包含一个值。例如,用
由
第一个是列表,第二个是元组。列表是可变的,元组不是。
请看本教程的数据结构部分和文档的序列类型部分。
括号和括号不同的另一种方式是方括号可以描述列表理解,例如
而相应的附加语法指定了一个元组生成器:
你可以用:
看:为什么在python中没有tuple理解?