>>> x=[1,2]
>>> x[1]
2
>>> x=(1,2)
>>> x[1]
2
它们都有效吗?有人更倾向于其中一个吗?
列表是可变的,也就是说你可以改变它的内容:
>>> 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]
一个有趣的不同之处:
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)
。
方括号和圆括号的另一个区别是,方括号可以描述一个列表推导,例如:[x for x in y]
相应的圆括号语法指定了一个元组生成器:(x for x in y)
您可以使用以下代码获取元组推导: tuple(x for x in y)
它们不是列表,而是一个列表和一个元组。您可以在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
用逗号分隔的项,用 (
和 )
括起来的是 元组
,用 [
和 ]
括起来的是 列表
。
:P
- Gandaro(
和 )
包围的是 tuple
,而被 [
和 ]
包围的是 list
。 - funroll(感谢Robert的澄清,以下仅适用于使用列表推导式的情况:)
!另一个非常重要的区别是,使用圆括号将得到一个生成器,因此与方括号的列表相比,内存消耗要低得多,特别是当您处理大型列表时 - 生成器不仅会占用显著较少的内存,而且还需要更少的时间,因为您不需要预先构建列表中的对象。
(...)
是元组,而[...]
是列表。据我所知,生成器是一个函数,但问题中有常量。 - Robert
(i for i in ...)
和[i for i in ...]
之间有一个更深刻的区别。 - Rik Poggi