Ситуация со списком и кортежем в Python - PullRequest
8 голосов
/ 17 февраля 2010

Есть ли ситуация, когда использование списка приводит к ошибке, и вместо нее необходимо использовать кортеж?

Я знаю кое-что о свойствах как кортежей, так и списков, но недостаточно, чтобы найти ответ на этот вопрос. Если бы вопрос был наоборот, то списки можно корректировать, а кортежи - нет.

Ответы [ 3 ]

14 голосов
/ 17 февраля 2010

Вы можете использовать кортежи в качестве ключей словаря, потому что они неизменны, но вы не можете использовать списки.Например:

d = {(1, 2): 'a', (3, 8, 1): 'b'}  # Valid.
d = {[1, 2]: 'a', [3, 8, 1]: 'b'}  # Error.
9 голосов
/ 18 февраля 2010

Из-за своей неизменной природы кортежи (в отличие от списков) могут быть хэш . Это то, что позволяет кортежам быть ключами в словарях, а также членами наборов. Строго говоря, это их хешабельность, а не их неизменность.

Таким образом, в дополнение к уже предоставленному ответу ключа словаря, пара других вещей, которые будут работать для кортежей, но не для списков:

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

>>> set([(1, 2), (2, 3, 4), (1, 2)])
set([(1, 2), (2, 3, 4)])
3 голосов
/ 12 марта 2010

В форматирование строки кортежи обязательны:

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

Использование списка в этом примере приводит к ошибке «недостаточно аргументов для строки формата», поскольку список рассматривается как один аргумент. Странно, но это правда.

...