Python中的列表与元组情况

Python中的列表与元组情况,python,list,tuples,Python,List,Tuples,是否存在使用列表导致错误的情况,而必须使用元组 我对元组和列表的属性都有所了解,但还不足以找到这个问题的答案。如果问题是相反的,那么列表可以调整,但元组不能。您可以使用元组作为字典键,因为它们是不可变的,但您不能使用列表。例如: d = {(1, 2): 'a', (3, 8, 1): 'b'} # Valid. d = {[1, 2]: 'a', [3, 8, 1]: 'b'} # Error. 由于元组(与列表不同)具有不可变的性质,因此它们是不可变的。这就是允许元组成为字典中的键以及

是否存在使用列表导致错误的情况,而必须使用元组


我对元组和列表的属性都有所了解,但还不足以找到这个问题的答案。如果问题是相反的,那么列表可以调整,但元组不能。您可以使用元组作为字典键,因为它们是不可变的,但您不能使用列表。例如:

d = {(1, 2): 'a', (3, 8, 1): 'b'}  # Valid.
d = {[1, 2]: 'a', [3, 8, 1]: 'b'}  # Error.

由于元组(与列表不同)具有不可变的性质,因此它们是不可变的。这就是允许元组成为字典中的键以及集合的成员的原因。严格地说,重要的是它们的哈希性,而不是它们的不变性

因此,除了已经给出的字典关键答案外,对元组有效但不适用于列表的其他两件事是:

>>> hash((1, 2))
3713081631934410656

>>> set([(1, 2), (2, 3, 4), (1, 2)])
set([(1, 2), (2, 3, 4)])

字符串格式中,元组是必需的:

"You have %s new %s" % ('5', 'mails') # must be a tuple, not a list!

在该示例中使用列表会产生错误“format string的参数不足”,因为列表被视为一个参数。奇怪但真实。

同样,集合是可变的,但冻结集合不是。因此,如果需要一个集合作为键,则必须将其转换为frozenset