Вступление
Списки и кортежи - две наиболее часто используемые структуры данных в Python, а третьей - словарь. Списки и кортежи имеют много общего. Некоторые из них перечислены ниже:
- Они оба являются типами данных последовательности, которые хранят коллекцию элементов.
- Они могут хранить элементы любого типа данных
- И любой элемент доступен по его индексу.
Итак, вопрос, на который мы пытаемся ответить, - чем они отличаются? И если между ними нет разницы, почему они должны быть у нас? Разве у нас нет ни списков, ни кортежей?
В этой статье мы покажем, чем списки и кортежи отличаются друг от друга.
Разница в синтаксисе
В Python списки и кортежи объявляются по-разному. Список создается с
использованием квадратных скобок []
тогда как кортеж создается с
помощью круглых скобок ()
. Взгляните на следующий пример:
tuple_names = ('Nicholas', 'Michelle', 'Alex')
list_names = ['Nicholas', 'Michelle', 'Alex']
print(tuple_names)
print(list_names)
Выход:
('Nicholas', 'Michelle', 'Alex')
['Nicholas', 'Michelle', 'Alex']
Мы определили кортеж с именем tuple_names
и список с именем
list_names
. В определении кортежа мы использовали круглые скобки ()
а в определении списка мы использовали квадратные скобки []
.
Python имеет type()
который помогает нам узнать тип созданного
объекта. Мы можем использовать его следующим образом:
print(type(tuple_names))
print(type(list_names))
Выход:
<class 'tuple'>
<class 'list'>
Изменяемый против неизменного
Списки изменяемы, в то время как кортежи неизменны, и это отмечает КЛЮЧЕВОЕ различие между ними. Но что мы подразумеваем под этим?
Ответ таков: мы можем изменять / модифицировать значения списка, но мы не можем изменять / модифицировать значения кортежа.
Поскольку списки изменяемы, мы не можем использовать список в качестве ключа в словаре. Это потому, что только неизменяемый объект может использоваться в качестве ключа в словаре. Таким образом, при необходимости мы можем использовать кортежи в качестве ключей словаря.
Давайте посмотрим на пример, демонстрирующий разницу между списками и кортежами с точки зрения неизменности.
Создадим список разных имен:
names = ["Nicholas", "Michelle", "Alex"]
Посмотрим, что произойдет, если мы попытаемся изменить первый элемент списка с «Николас» на «Самуил»:
names[0] = "Samuel"
Обратите внимание, что первый элемент имеет индекс 0.
Теперь давайте отобразим содержимое списка:
>>> names
Выход:
['Samuel', 'Michelle', 'Alex']
Вывод показывает, что первый элемент списка был успешно изменен!
Что, если мы попытаемся сделать то же самое с кортежем? Посмотрим:
Сначала создайте кортеж:
names = ("Nicholas", "Michelle", "Alex")
Давайте теперь попробуем изменить первый элемент кортежа с «Николас» на «Самуил»:
names[0] = "Samuel"
Выход:
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
names[0] = "Samuel"
TypeError: 'tuple' object does not support item assignment
Мы получили ошибку о том, что объект кортежа не поддерживает назначение элементов. Причина в том, что объект кортежа нельзя изменить после его создания.
Повторное использование или копирование
Кортежи нельзя копировать. Причина в том, что кортежи неизменяемы. Если
вы запустите tuple(tuple_name)
, он немедленно вернется. Например:
names = ('Nicholas', 'Michelle', 'Alex')
copyNames = tuple(names)
print(names is copyNames)
Выход:
True
Эти два одинаковые.
Напротив, list(list_name)
требует копирования всех данных в новый
список. Например:
names = ['Nicholas', 'Michelle', 'Alex']
copyNames = list(names)
print(names is copyNames)
Выход:
False
Затем давайте обсудим, чем список и кортеж различаются по размеру.
Разница в размерах
Python выделяет память кортежам в виде блоков большего размера с низкими накладными расходами, поскольку они неизменяемы. С другой стороны, для списков Pythons выделяет небольшие блоки памяти. В конце кортеж будет иметь меньший объем памяти по сравнению со списком. Это делает кортежи немного быстрее, чем списки, когда у вас большое количество элементов.
Например:
tuple_names = ('Nicholas', 'Michelle', 'Alex')
list_names = ['Nicholas', 'Michelle', 'Alex']
print(tuple_names.__sizeof__())
print(list_names.__sizeof__())
Выход:
48
64
Приведенный выше вывод показывает, что список имеет больший размер, чем кортеж. Размер указан в байтах.
Однородный против неоднородного
Кортежи используются для хранения разнородных элементов, которые являются элементами, принадлежащими к разным типам данных. Списки, с другой стороны, используются для хранения однородных элементов, то есть элементов, принадлежащих к одному типу.
Однако учтите, что это только смысловая разница. Вы можете хранить элементы одного типа в кортеже и элементы разных типов в списке. Например:
list_elements = ['Nicholas', 10, 'Alex']
tuple_elements = ('Nicholas', "Michelle", 'Alex')
Приведенный выше код будет работать без ошибок, несмотря на то, что список содержит смесь строк и числа.
Переменная длина по сравнению с фиксированной длиной
Кортежи имеют фиксированную длину, а списки - переменную. Это означает, что мы можем изменить размер созданного списка, но не можем изменить размер существующего кортежа. Например:
list_names = ['Nicholas', 'Michelle', 'Alex']
list_names.append("Mercy")
print(list_names)
Выход:
['Nicholas', 'Michelle', 'Alex', 'Mercy']
Выходные данные показывают, что в список добавлено четвертое имя. Для
этого мы использовали функцию append()
Мы могли бы добиться того же с
помощью функции insert()
как показано ниже:
list_names = ['Nicholas', 'Michelle', 'Alex']
list_names.insert(3, "Mercy")
print(list_names)
Выход:
['Nicholas', 'Michelle', 'Alex', 'Mercy']
Выходные данные снова показывают, что в список добавлен четвертый элемент.
Кортеж Python не дает нам возможности изменить его размер.
Заключение
Мы можем сделать вывод, что, хотя и списки, и кортежи являются структурами данных в Python, между ними есть заметные различия, главное отличие в том, что списки изменяемы, а кортежи неизменны. Список имеет переменный размер, а кортеж - фиксированный. Операции с кортежами могут выполняться быстрее, чем операции со списками.