Случаи, когда использование кортежа является обязательным

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

Поэтому мне было интересно, есть ли случаи, когда использование кортежа над списком является обязательным. Вещи, которые невозможно сделать с помощью списка, но могут выполняться с помощью кортежа?

Ответы

Ответ 1

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

>>> {}[tuple()] = 1
>>> {}[list()] = 1 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

Это в основном результат хеширования tuple, тогда как a list не является:

>>> hash(list())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash(tuple())
3527539

Ответ 2

Ответ @Otto очень хороший. Единственное, что я должен добавить к этому, это то, что когда вы открываете вещи до сторонних расширений, вам действительно нужно проконсультироваться с документацией. Некоторые функции/методы могут ожидать один или другой тип данных (или иметь разные результаты в зависимости от того, какой из них вы используете). Одним из примеров является использование кортежей/списков для индексации массива numpy:

import numpy as np
a=np.arange(50)
a[[1,4,8]] #array([1, 4, 8])
a[(1,4,8)] #IndexError

ИЗМЕНИТЬ

Кроме того, быстрый тест времени показывает, что создание кортежа MUCH FASTER, чем создание списка:

import timeit
t=timeit.timeit('[1,2,3]',number=10000000)
print (t)
t=timeit.timeit('(1,2,3)',number=10000000)
print (t)

что хорошо иметь в виду. Другими словами, do:

for num in (8, 15, 200):
    pass

вместо:

for num in [8, 15, 200]:
    pass

Ответ 3

Кроме того, теперь устаревшее форматирование строки с использованием оператора % требует, чтобы список аргументов был кортежем. Список будет рассматриваться как единственный аргумент:

>>> "%s + %s" % [1, 2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
>>> "%s + %s" % (1, 2)
'1 + 2'