какая разница имеется между типами данных список и кортеж
Чем отличается кортеж от списка в Python
Кортежи и списки – это два из четырех доступных в Python встроенных типов данных. Оба типа полезны и на первый взгляд могут показаться похожими. Но у них есть существенные различия. Каждый из этих типов данных имеет собственные use cases. О том, чем отличается кортеж от списка в Python, мы бы и хотели сегодня поговорить.
В этой статье мы рассмотрим, как работают кортежи и списки, обсудим их индивидуальные характеристики и уникальные варианты использования. И, разумеется, разберем их сходства и различия.
Советуем вам тестировать все примеры кода, приведенные в статье, на собственной машине. Это поможет лучше разобраться в предмете и надежнее все запомнить.
Итак, давайте начнем!
Что из себя представляют кортежи и списки?
Кортежи и списки – это встроенные структуры данных. Это контейнеры, в которых можно хранить упорядоченную коллекцию из одного или нескольких элементов.
Это особенно полезно для отладки.
Теперь давайте посмотрим, что у кортежей и списков общего.
Сходства между кортежами и списками в Python
Как мы упоминали ранее, кортежи и списки действительно похожи. У них есть общие функции, о которых мы сейчас поговорим.
Кортежи и списки могут хранить несколько элементов в одной переменной
Кортежи и списки могут быть пустыми или содержать один или даже несколько элементов в одной переменной.
При создании кортежа из одного элемента не забудьте добавить запятую в конце.
Также, если вы используете метод tuple() при создании кортежа, не забывайте, что для этого нужны двойные круглые скобки.
Если вы не добавите запятую в конце, Python не распознает это как кортеж.
А вот при создании списка из одного элемента не нужно беспокоиться о добавлении запятой.
Хранящиеся в списках и кортежах элементы обычно похожи по своей природе и каким-то образом связаны друг с другом.
Вы можете создать кортеж или список, содержащий только последовательность строк, только последовательность целых чисел или только последовательность логических значений. При этом каждый элемент последовательности должен быть разделен запятой.
Однако вы также можете создать кортеж или список, содержащий смесь разных типов данных.
Списки и кортежи могут содержать повторяющиеся элементы, а значения могут дублироваться, появляясь несколько раз.
Если вы забудете запятые, вы получите следующее сообщение об ошибке:
Марк Лутц «Изучаем Python»
Скачивайте книгу у нас в телеграм
В Python и кортежи, и списки поддерживают распаковку
По сути, при создании кортежа или списка значения «упаковываются» в одну переменную, как мы упоминали ранее.
front_end = (“html”, “css”, “javascript”)
Эти значения можно «распаковать» и присвоить отдельным переменным.
Убедитесь, что создаваемых вами переменных столько же, сколько значений внутри кортежа/списка, иначе Python выдаст вам ошибку:
Элементы и списков,и кортежей доступны по индексу
Как упоминалось ранее, кортежи и списки представляют собой упорядоченные наборы элементов.
Порядок элементов устанавливается при создании списка или кортежа. Он неизменен и сохраняется на протяжении всего срока жизни программы. (Порядок и количество элементов в списке можно изменить, и это мы обсудим чуть ниже. Но сам собой порядок не изменится).
Каждое значение в кортеже и списке имеет уникальный идентификатор, также известный как индекс.
Таким образом, к любому элементу в кортеже или списке можно получить доступ, сославшись на его индекс.
Напомним, что индексация в Python (как и в большинстве языков программирования) начинается с 0. То есть первый элемент имеет индекс 0, второй элемент имеет индекс 1 и так далее.
Чтобы обратиться к конкретному элементу, вы пишете имя кортежа или списка, а затем индекс нужного элемента в квадратных скобках.
Теперь, когда мы увидели, насколько кортежи и списки похожи, давайте посмотрим, чем они отличаются.
Чем кортеж отличается от списка?
Кортежи, в отличие от списков, неизменяемы
В Python кортежи неизменяемы. Это означает, что после создания кортежа элементы внутри него не могут измениться.
Если вы попытаетесь изменить значение одного из элементов, вы получите сообщение об ошибке:
Поскольку кортежи неизменяемы, нельзя добавлять, заменять, переназначать или удалять содержащиеся в них элементы.
Это также означает, что кортежи имеют фиксированную длину. Она не меняется на протяжении всего жизненного цикла программы.
Когда использовать кортежи
Кортежи удобно использовать, если вы хотите, чтобы данные в вашей коллекции были доступны только для чтения и всегда оставались неизменными и постоянными.
Благодаря гарантии неизменности кортежи могут использоваться в словарях и множествах, для которых требуется, чтобы содержащиеся в них элементы имели неизменяемый тип.
Когда использовать списки
С другой стороны, списки можно легко редактировать и модифицировать, потому что они изменяемы.
Вы можете добавлять элементы в список, удалять элементы из списка, перемещать элементы и заменять их.
Это означает, что длина и размер списков увеличивается и уменьшается на протяжении жизненного цикла программы.
Списки полезны, когда вы хотите, чтобы ваши данные были гибкими или чтобы при необходимости их можно было изменить.
В Python есть множество встроенных методов для выполнения разнообразных операций со списками. Использовать эти методы с кортежами не выйдет.
Давайте рассмотрим несколько простых способов изменения списков.
Как изменять списки в Python
Поскольку списки изменяемы, вам необходимо знать несколько основных способов обновления данных в них.
Как обновить элемент в списке в Python
Чтобы обновить конкретный элемент в списке, нужно указать его индекс в квадратных скобках. Затем ему можно присвоить новое значение.
Как добавить элементы в список в Python
Он вставляет элемент в список на конкретное место. Остальные элементы в списке, идущие после, сдвигаются на одну позицию вправо.
Он добавляет итерируемый объект в конец списка. Например, вы можете добавить новый список в конец уже существующего.
Как удалить элементы из списка в Python
В Python есть два встроенных метода для удаления элементов из списка.
Без передачи аргумента он удалит последний элемент в списке.
Также можно передать в pop() в качестве аргумента индекс конкретного элемента, который необходимо удалить.
В обоих случаях удаленное значение возвращается, что полезно. При желании вы можете сохранить его в отдельной переменной для дальнейшего использования.
Заключение
Итак, мы разобрали, чем отличается кортеж от списка в Python. Кроме того, мы обсудили, как работают кортежи и списки и как они обычно используются.
Повторим, что общего у списков и кортежей:
А чем отличается кортеж от списка? Основное отличие — (не)изменяемость:
Спасибо за чтение и успехов в написании кода!
Списки (List) vs Кортежи (Typle)
Списки и кортежи используются для последовательного хранения одного или нескольких объектов или типов данных Python. И те и другие могут хранить любые данные, такие как целые числа, плавающие числа, строки и словари. Списки и кортежи похожи по большинству параметров, но здесь мы опишем основные различия между ними.
Различия в представлении
Рассмотрим следующий пример.
Изменяемые списки и неизменяемые кортежи в Python
Теперь мы меняем 0-й элемент индекса “Peter” на “Samson”.
Теперь мы создаем кортеж и делаем то же самое.
Мы получаем ошибку при изменении 1-го элемента кортежа из-за неизменяемости. Он не поддерживает присвоение элементов.
Отладка кортежей и списков в Python
Кортежи легко отлаживать в большом проекте из-за их неизменяемости. Если у нас небольшой проект или меньшее количество данных, то списки играют эффективную роль. Рассмотрим следующий пример:
Будет сложно отслеживать эти изменения в списках, но неизменяемый объект кортежа не может измениться после создания. Поэтому кортежи легче отлаживать.
Поддержка функций у кортежей и списков в Python
Кортежи поддерживают меньше операций, чем списки. Встроенный dir(object) используется для получения всех поддерживаемых функций для списка и кортежа.
Функциии списков (List)
Функциии кортежей (Tuple)
Расходование памяти у списков (List) и у кортежей (Tuple) в Python
Кортежи более эффективны с точки зрения использования памяти, чем списки, поскольку кортеж имеет меньше встроенных операций. Списки подходят для работы с небольшим количеством элементов, в то время как кортежи немного быстрее, чем списки, для работы с огромным количеством данных.
В некоторых случаях списки могут показаться более полезными, чем кортежи. Но кортежи являются важными структурами данных в Python. Кортежи обычно используются для неизменяемых данных, или можно сказать, что данные в кортежах “защищены от записи”. Кортежи передают интерпретатору Python указание на то, что данные не должны меняться в будущем. Мы можем использовать кортеж так же, как и словарь, не используя ключи для хранения данных, например:
Кортежи могут использовать ключи словаря, поскольку они хэшируемы и неизменяемы, в то время как списки не могут использовать ключи словаря.
Оптимизации, используемые в Python: список и кортеж
В Python, есть два похожих типа — список (list) и кортеж (tuple). Самая известная разница между ними состоит в том, что кортежи неизменяемы.
Вы не можете изменить объекты в tuple:
Но вы можете модифицировать изменяемые объекты внутри кортежа:
Внутри CPython (стандартного интерпретатора), список и кортеж реализованы как лист из указателей (ссылок) на Python объекты, т.е. физически они не хранят объекты рядом с друг другом. Когда вы удаляете объект из списка происходит удаление ссылки на этот объект. Если на объект ещё кто-то ссылается, то он продолжит находиться в памяти.
Кортежи
Несмотря на тот факт, что кортежи намного реже встречаются в коде и не так популярны, это очень фундаментальный тип, который Python постоянно использует для внутренних целей.
Вы можете не замечать, но вы используете кортежи когда:
Пустые списки vs пустые кортежи
Пустой кортеж работает как синглтон, т.е. в памяти запущенного Python скрипта всегда находится только один пустой кортеж. Все пустые кортежи просто ссылаются на один и тот же объект, это возможно благодаря тому, что кортежи неизменяемы. Такой подход сохраняет много памяти и ускоряет процесс работы с пустыми кортежами.
Но это не работает со списками, ведь они могут быть изменены:
Оптимизация выделения памяти для кортежей
Для того, чтобы снизить фрагментацию памяти и ускорить создание кортежей, Python переиспользует старые кортежи, которые были удалены. Если кортеж состоит из менее чем 20 элементов и больше не используется, то вместо удаления Python помещает его в специальный список, в котором хранятся свободные для повторного использования кортежи.
Этот список разделен на 20 групп, где каждая группа представляет из себя список кортежей размера n, где n от 0 до 20. Каждая группа может хранить до 2 000 свободных кортежей. Первая группа хранит только один элемент и представляет из себя список из одного пустого кортежа.
В примере выше, мы можем видеть, что a и b имеют одинаковый адрес в памяти. Это происходит из-за того, что мы мгновенно заняли свободный кортеж такого же размера.
Оптимизация выделения памяти для списков
Так как списки могут изменяться, такую же оптимизацию как в случае с кортежами провернуть уже не получится. Несмотря на это, для списков используется похожая оптимизация нацеленная на пустые списки. Если пустой список удаляется, то он так же может быть переиспользован в дальнейшем.
Изменение размера списка
Чтобы избежать накладные расходы на постоянное изменение размера списков, Python не изменяет его размер каждый раз, как только это требуется. Вместо этого, в каждом списке есть набор дополнительных ячеек, которые скрыты для пользователя, но в дальнейшем могут быть использованы для новых элементов. Как только скрытые ячейки заканчиваются, Python добавляет дополнительное место под новые элементы. Причём делает это с хорошим запасом, количество скрытых ячеек выбирается на основе текущего размера списка — чем он больше, тем больше дополнительных скрытых слотов под новые элементы.
Эта оптимизация особенно выручает, когда вы пытайтесь добавлять множество элементов в цикле.
Паттерн роста размера списка выглядит примерно так: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88,…
Для примера, если вы хотите добавить новый элемент в список с 8 элементами, то свободных ячеек в нём уже не будет и Python сразу расширит его размер до 16 ячеек, где 9 из них будут заняты и видны пользователю.
Формула выбора размера написанная на Python:
Скорость
Если сравнивать эти два типа по скорости, то в среднем по больнице, кортежи слегка быстрее списков. У Raymond Hettinger есть отличное объяснение разницы в скорости на stackoverflow.
В чем разница между списками и кортежами?
Каковы преимущества / недостатки кортежей / списков?
Использование этого различия делает код более явным и понятным.
Одним из примеров могут быть пары страниц и номера строк для ссылок на места в книге, например:
Могут быть ситуации, когда вы хотите изменить элементы в существующем кортеже местоположения, например, при переборе по строкам страницы. Но неизменность кортежей заставляет вас создавать новый кортеж местоположения для каждого нового значения. На первый взгляд это кажется неудобным, но использование таких неизменяемых данных является краеугольным камнем типов значений и методов функционального программирования, которые могут иметь существенные преимущества.
В статически типизированном языке, таком как Haskell, значения в кортеже обычно имеют разные типы, и длина кортежа должна быть фиксированной. В списке все значения имеют одинаковый тип, а длина не фиксирована. Так что разница очень очевидна.
Разница между списком и кортежем
буквальный
Размер
Из-за меньшего размера операции кортежа она становится немного быстрее, но не так много, чтобы упоминать, пока у вас не будет огромное количество элементов.
Разрешенные операции
Это также означает, что вы не можете удалить элемент или отсортировать кортеж. Однако вы можете добавить новый элемент в список и кортеж с той лишь разницей, что, поскольку кортеж неизменен, вы на самом деле не добавляете элемент, а создаете новый кортеж, поэтому идентификатор изменится
Применение
Поскольку список является изменяемым, его нельзя использовать в качестве ключа в словаре, тогда как кортеж можно использовать.
Если вы пошли гулять, вы можете записать свои координаты в любой момент в (x,y) кортеже.
Если вы хотите записать свое путешествие, вы можете добавлять свое местоположение каждые несколько секунд в список.
Но вы не могли сделать это наоборот.
Главное отличие в том, что кортежи неизменны. Это означает, что вы не можете изменить значения в кортеже после его создания.
Поэтому, если вам нужно изменить значения, используйте список.
Преимущества для кортежей:
Списки изменчивы; кортежей нет.
Кортежи являются неизменяемыми и обычно содержат гетерогенную последовательность элементов, доступ к которым осуществляется посредством распаковки (см. Далее в этом разделе) или индексации (или даже по атрибуту в случае именованных кортежей). Списки являются изменяемыми, и их элементы обычно однородны и доступны путем итерации по списку.
Было упомянуто, что разница в значительной степени семантическая: люди ожидают, что кортеж и список будут представлять различную информацию. Но это идет дальше, чем руководство; некоторые библиотеки на самом деле ведут себя по-разному в зависимости от того, что они передаются. Возьмем, к примеру, NumPy (скопировано из другого поста, где я прошу больше примеров):
Дело в том, что хотя NumPy может и не входить в стандартную библиотеку, это основная библиотека Python, а в списках и кортежах NumPy совершенно разные вещи.
Списки обычно однородны, кортежи обычно неоднородны.
Списки для переменной длины, кортежи для фиксированной длины.
Это пример списков Python:
Это пример кортежа Python:
Для кортежей «порядок» означает не что иное, как определенную «структуру» для хранения информации. Какие значения находятся в первом поле, можно легко переключить во второе поле, поскольку каждое из них предоставляет значения в двух разных измерениях или масштабах. Они дают ответы на различные типы вопросов и обычно имеют форму: для какого объекта / предмета каковы его атрибуты? Объект / субъект остается постоянным, атрибуты различаются.
Для списков «порядок» означает последовательность или направленность. Второй элемент ДОЛЖЕН идти после первого элемента, потому что он расположен на 2-м месте в зависимости от определенной и общей шкалы или измерения. Элементы взяты целиком и в основном дают ответы на один вопрос, как правило, в форме, для данного атрибута, как эти объекты / субъекты сравниваются? Атрибут остается постоянным, объект / тема отличается.
Есть бесчисленные примеры людей в популярной культуре и программистов, которые не соответствуют этим различиям, и есть бесчисленное множество людей, которые могут использовать вилку для салата в качестве основного блюда. В конце концов, все в порядке, и оба обычно могут выполнить свою работу.
Подводя итог некоторых мелких деталей
сходства:
Чем кортеж отличается от списка в Python
В этом руководстве мы узнаем о важном различии между списком и кортежами и о том, как оба они играют важную роль в Python.
Списки и кортежи используются для последовательного хранения одного или нескольких объектов Python или типов данных. Оба могут хранить любые данные, такие как целое число, число с плавающей запятой, строку и словарь. Списки и кортежи схожи по большинству факторов, но здесь мы опишем основное различие между ними.
Давайте обсудим основные отличия списка и кортежа в Python.
| № | Список | Кортеж |
|---|---|---|
| 1 | Синтаксис списка с помощью []. | Синтаксис кортежа с помощью (). |
| 2 | Изменяемый | Неизменен |
| 3 | Имеет переменную длину. | Имеет фиксированную длину. |
| 4 | Предоставляет больше возможностей, чем кортеж. | Обеспечивает меньшую функциональность, чем список. |
| 5 | Список используется в сценарии, в котором нам нужно хранить простые коллекции без ограничений, где значение элементов может быть изменено. | Кортеж используется в тех случаях, когда нам нужно хранить коллекции только для чтения, т.е. значение элементов не может быть изменено. Его можно использовать в качестве ключа внутри словаря. |
| 6 | Менее эффективны для памяти, чем кортеж. | Более эффективны в памяти из-за своей неизменности. |
Различия в представлении
Представление списков и кортежей незначительно отличается. Список обычно заключен в квадратную скобку [], а элементы разделены запятыми. Кортежи в Python заключаются в круглые скобки() и элементы также разделяются запятой. Скобки использовать необязательно, и эти типы кортежей называются упаковкой кортежей.
Рассмотрим следующий пример:
В приведенной выше программе мы определили переменную list1, которая содержит список различных типов данных от индекса 0 до 4. Мы определили другую переменную tuple1, которая содержит кортеж с разными типами данных. Он заключен в().
Изменяемые списки и неизменяемые кортежи
Это наиболее важное различие между списком и кортежем, в то время как списки изменяемы, а кортежи неизменны. Списки изменяемы, что означает, что объект Python может быть изменен после создания, тогда как кортежи не могут быть изменены после создания. Рассмотрим данный пример:
Теперь мы меняем 0-й элемент индекса «Peter» на «Samson».
Теперь мы создаем кортеж и делаем то же самое.
Мы получаем ошибку при изменении 1-го элемента кортежа из-за неизменяемости. Он не поддерживает назначение элементов.
Отладка
Кортежи легко отлаживать в большом проекте из-за их неизменности. Если у нас небольшой проект или немного данных, то списки играют эффективную роль. Рассмотрим следующий пример:
В приведенном выше коде мы сделали b = a; здесь мы не копируем объект списка из b в a. Буква b относится к адресу списка a. Это означает, что если мы внесем изменение в b, это будет отражать то же самое, что и в списке a, и это упростит отладку. Но это сложно для значительного проекта, в котором объекты Python могут иметь несколько ссылок.
Отследить эти изменения в списках будет очень сложно, но неизменяемый кортеж объектов не может измениться после создания. Таким образом, кортежи легко отлаживать.
Поддержка функций
Кортежи поддерживают меньше операций, чем список. Встроенный каталог(объект) используется для получения всех поддерживаемых функций для списка и кортежа.
Эффективная память
Кортежи более эффективны с точки зрения памяти, чем список, потому что имеют меньше встроенных операций. Списки подходят для меньшего количества элементов, тогда как кортежи немного быстрее, чем список для огромного количества данных.