Случаи, когда использование кортежа является обязательным
В 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'