Python Tuple vs List: сходства и различия, объяснение
Опубликовано: 2022-08-08В этом руководстве вы узнаете о сходствах и различиях между кортежами и списками Python. Вы также поймете, когда следует использовать кортеж.
Список и кортежи являются встроенными структурами данных в Python. Их можно использовать для хранения набора элементов.
От поддержки индексации и нарезки до содержания разнородных типов данных кортежи и списки могут иметь сходную функциональность. Поэтому понимание сходств и различий между ними может помочь вам решить, какую структуру данных использовать.
Давайте начнем.
Вы можете запустить Python REPL и следовать этому руководству. Вы также можете использовать онлайн-редактор Python от Geekflare для написания кода.
Кортеж Python против списка: в чем сходство?
Начнем с изучения сходства между списками и кортежами. Чтобы облегчить обучение, мы представляем примеры как списков, так и кортежей.

# 1 . Итерации Python
В Python списки заключаются в пару квадратных скобок, тогда как кортежи заключаются в круглые скобки. Вы также можете создать кортеж как набор значений, разделенных запятыми, но без круглых скобок.
Они оба итерируемые; так что вы можете перебрать их, используя цикл for .
В приведенной ниже ячейке кода показано, как выполнять итерацию по списку.
nums = [2,6,7,10] print(f"Type of nums is {type(nums)}") for num in nums: print(num) # Output Type of nums is <class 'list'> 2 6 7 10Как объяснено ниже, вы также можете перебирать кортеж, используя цикл
nums = (2,6,7,10) # Note: nums = 2,6,7,10 is a valid tuple as well. If needed, run a quick check! print(f"Type of nums is {type(nums)}") for num in nums: print(num) # Output Type of nums is <class 'tuple'> 2 6 7 10# 2 . Поддержка создания из других последовательностей
Следующее сходство между списками и кортежами заключается в том, что их можно создавать из существующих последовательностей, таких как строки.
sample_str = "Coding!" В следующей ячейке кода показано, как list(string) возвращает список, элементами которого являются символы в строке.
list_from_str = list(sample_str) print(list_from_str) # Output ['C', 'o', 'd', 'i', 'n', 'g', '!'] Точно так же кортеж может быть создан из строки или другой последовательности с помощью tuple(sequence) . Ячейка кода ниже показывает, как вы можете это сделать.
tuple_from_str = tuple(sample_str) print(tuple_from_str) # Output ('C', 'o', 'd', 'i', 'n', 'g', '!')# 3 . Поддержка индексации и нарезки
Python поддерживает нулевую индексацию, при которой первый элемент имеет нулевой индекс, второй — единичный и т. д. Python также поддерживает отрицательное индексирование, когда последний элемент имеет индекс -1, предпоследний элемент имеет индекс -2 и так далее.
list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!'] print(list_from_str[1]) # oЭлемент с индексом -2 является предпоследним элементом, 'g'.
tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!') print(tuple_from_str[-2]) # gВы можете использовать нарезку, когда хотите работать с небольшой частью списка или кортежа. list[start:end] возвращает фрагмент списка, начинающийся с начала индекса и расширяющийся до конца — 1. Значение по умолчанию для начала равно 0, а конец — это последний элемент в итерируемом объекте.
Вы можете нарезать кортежи, используя тот же синтаксис. Давайте создадим срезы списка и кортежа, которые мы создали ранее.
list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!'] print(list_from_str[0:5]) ['C', 'o', 'd', 'i', 'n'] В дополнение к начальному и конечному значениям вы также можете указать значение шага. tuple(start:end:step) возвращает фрагмент кортежа от start до end - 1 с шагом step .
tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!') print(tuple_from_str[::2]) ('C', 'd', 'n', '!')Здесь мы устанавливаем значение шага равным 2. Таким образом, срез содержит каждый второй элемент.
# 4 . Коллекции нескольких типов данных
В рассмотренных нами примерах все элементы списка и кортежи имели один и тот же тип данных.
Однако вы можете хранить значения разных типов данных в одном списке или кортеже.
Фрагмент кода ниже student_list содержит имя учащегося в виде строки, возраст в виде целого числа и оценки, защищенные в виде числа с плавающей запятой.
student_list = ["John",22,96.5] for item in student_list: print(f"{item} is of type {type(item)}") # Output John is of type <class 'str'> 22 is of type <class 'int'> 96.5 is of type <class 'float'>Мы можем придумать аналогичный пример для кортежа.
student_tuple = ("Jane",23,99.5) for item in student_tuple: print(f"{item} is of type {type(item)}") # Output Jane is of type <class 'str'> 23 is of type <class 'int'> 99.5 is of type <class 'float'># 5 . Поддержка тестирования членства
И списки, и кортежи позволяют выполнять проверку членства на наличие определенных элементов. Если вы хотите проверить, присутствует ли конкретный элемент в списке или кортеже, вы можете использовать оператор in .
Элемент выражения
item in iterableоценивается какTrue, еслиiterableсодержитitem; иначеFalse.
"Alex" in student_list # False "Jane" in student_tuple # TrueИтак, вы узнали сходство между списками и кортежами в Python. Далее давайте изучим ключевые различия между двумя структурами данных.
Python Tuple и список: в чем разница?
# 1 . Изменяемость списков и неизменность кортежей в Python
Самое важное различие между списком и кортежем в Python заключается в том, что кортеж неизменяем . Это означает, что вы не можете изменить кортеж на месте.
️ Вот пример.
tuple1 = ("Java","Python","C++") tuple1[0] = "Rust" # Output ----> 2 tuple1[0] = "Rust" TypeError: 'tuple' object does not support item assignmentСписок — это изменяемая структура данных, поэтому мы можем изменить список, изменив элемент по определенному индексу, как в следующей ячейке кода.
list1 = ["Java","Python","C++"] list1[0] = "Rust" print(list1) # Output ['Rust', 'Python', 'C++']# 2 . Списки переменной длины и кортежи фиксированной длины
Список Python — это структура данных переменной длины.
Вы можете сделать следующее:
- Добавить элемент в конец списка
- Добавить элементы из другого списка в конец текущего списка
- Удалить элементы по определенному индексу из списка
list1 = [2,3,4,5] # add an item to the end list1.append(9) print(list1) # add items from list2 to the end of list1 list2 = [0,7] list1.extend(list2) print(list1) # remove an item from list1 list1.pop(0) print(list1)️ Вывод приведенного выше фрагмента кода.
# Output [2, 3, 4, 5, 9] [2, 3, 4, 5, 9, 0, 7] [3, 4, 5, 9, 0, 7]Кортежи — это структуры данных фиксированной длины. Таким образом, вы не можете добавлять или удалять элементы из существующего кортежа. Но вы можете переопределить кортеж, чтобы он содержал другие элементы.

tuple1 = (2,4,6,8) tuple1 = (1,8,9) print(tuple1) # Output (1, 8, 9)# 3 . Размер в памяти
Теперь мы будем опираться на то, что узнали в предыдущем разделе: список — это структура данных переменной длины .
Когда вы изначально определяете список, для него выделяется определенный размер в памяти. Теперь, когда вы изменяете список с помощью методов append() или extend() , для хранения добавленных элементов должна быть выделена дополнительная память. Это распределение почти всегда делается больше, чем количество элементов, которые вы добавляете.
Поэтому необходимо отслеживать количество элементов в списке и выделенное пространство. Кроме того, поскольку списки имеют переменную длину, имеется указатель, указывающий на адрес элементов списка. В результате списки длины k занимают больше памяти, чем кортеж с теми же k элементами.
Вот простая иллюстрация.

Вы можете использовать метод getsizeof() встроенного модуля sys для объекта Python, чтобы получить размер объекта в памяти.
import sys list1 = [4,5,9,14] list_size = sys.getsizeof(list1) print(f"Size of list:{list_size}") tuple1 = (4,5,9,14) tuple_size = sys.getsizeof(tuple1) print(f"Size of tuple:{tuple_size}")Список занимает больше памяти, чем кортеж, для того же количества и значения элементов, как показано в выходных данных ниже.
# Output Size of list:104 Size of tuple:88 
Когда следует использовать кортеж Python?
Из различий и сходств между списками и кортежами Python вы знаете, что если вам нужна изменяемая коллекция, вы должны использовать список .
Но когда вместо этого следует использовать кортеж?
Мы рассмотрим это в этом разделе.
# 1 . Коллекция только для чтения
Всякий раз, когда вы хотите, чтобы коллекция была неизменной, вы должны определить ее как кортеж. Предположим color = (243,55,103) кортеж, содержащий значения RGB, соответствующие оттенку цвета. Определение цвета как кортежа гарантирует, что его нельзя изменить.
По сути, когда вам нужно, чтобы коллекция была доступна только для чтения: значения не должны изменяться во время программы, вам следует рассмотреть возможность использования кортежа. Это предотвратит непреднамеренное изменение значений.
# 2 . Ключи словаря
Например, вы создаете словарь, используя элементы списка key_list в качестве ключей. Вы можете использовать метод dict.fromkeys() для создания словаря из списка.
key_list = list("ABCD") dict.fromkeys(key_list) {'A': None, 'B': None, 'C': None, 'D': None}Предположим, вы изменили список, чтобы он содержал 'D' в качестве первого элемента (индекс 0) — перед созданием словаря.
Что теперь происходит с ключом словаря «А»?
Если вы попытаетесь создать словарь из key_list и получить доступ к значению, соответствующему ключу «A», вы столкнетесь с KeyError .
key_list[0] = 'D' dict.fromkeys(key_list)['A'] --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-31-c90392acc2cf> in <module>() ----> 1 dict.fromkeys(key_list)['A'] KeyError: 'A'Ключи словаря должны быть уникальными. Таким образом, у вас не может быть второй буквы «D» в качестве ключа.
dict.fromkeys(key_list) {'B': None, 'C': None, 'D': None} # A is no longer a key.Если вместо этого вы используете кортеж, такая модификация невозможна, и вы с меньшей вероятностью столкнетесь с ошибками. Следовательно, вам следует создать словарь, используя элементы кортежа в качестве ключей.
key_tuple = tuple("ABCD") dict.fromkeys(key_tuple) {'A': None, 'B': None, 'C': None, 'D': None} key_tuple[0] = 'D' --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-12-2cecbefa7db2> in <module>() ----> 1 key_tuple[0] = 'D' TypeError: 'tuple' object does not support item assignment# 3 . Аргументы функции
Неизменяемость кортежей также делает их пригодными для передачи в качестве аргументов функции.
Рассмотрим следующую функцию find_volume() , которая возвращает объем прямоугольного параллелепипеда с заданными размерами: длиной, шириной и высотой.
def find_volume(dimensions): l,b,h = dimensions return l*b*h Предположим, что эти измерения доступны в списке с именем dimensions . Вызов find_volume() с dimensions в качестве аргумента возвращает объем.
dimensions = [2,8,5] find_volume(dimensions) 80Вы всегда можете изменить размеры, хранящиеся в списке.
dimensions = [20,8,5] find_volume(dimensions) 800Однако иногда вам нужно, чтобы значения оставались постоянными и не поддавались изменению. Именно тогда вам следует подумать о сохранении аргументов в виде кортежа и использовании их в вызове функции.
# 4 . Возвращаемые значения из функций
В Python вы столкнетесь с кортежами в возвращаемых значениях функций. Когда вы возвращаете несколько значений из функции, Python неявно возвращает их в виде кортежа.
Рассмотрим следующую функцию return_even() :
def return_even(num): even = [i for i in range(num) if (i%2==0)] return even,len(even)- В качестве аргумента принимает число
num - Он возвращает список четных чисел в интервале
[0,num)и длину этого списка.
Давайте установим значение num 20 и вызовем функцию.
num = 20 Вызов return_even() возвращает два значения в кортеже. Вы можете вызвать функцию type() с вызовом функции в качестве аргумента проверки.
type(return_even(num)) # <class 'tuple'>Вы можете распечатать возвращаемое значение, чтобы убедиться, что это кортеж, содержащий список четных чисел в качестве первого элемента и длину списка в качестве второго элемента.
print(return_even(num)) ([0, 2, 4, 6, 8, 10, 12, 14, 16, 18], 10)Поскольку в кортеже два элемента, вы можете распаковать их в две переменные, как показано ниже.
even_nums, count = return_even(num) print(even_nums) print(count) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 10Вывод
Я надеюсь, что в этом руководстве было представлено всестороннее сравнение кортежей и списков Python.
Давайте завершим урок кратким резюме:
- Список и кортежи — это встроенные структуры данных в Python.
- Сходства : итерации, поддержка индексирования, нарезки, различных типов данных и оператора для проверки членства.
- Ключевое отличие : списки изменяемы, а кортежи неизменяемы.
- Другие отличия : Фиксированная длина кортежей и переменная длина списков, меньший размер кортежей в памяти.
- Когда следует использовать кортеж? Для неизменяемых коллекций, ключей словаря и аргументов функций.
Затем ознакомьтесь с проектами Python, чтобы практиковаться и учиться. Или изучите методы удаления повторяющихся элементов из списков Python. Приятного обучения! тогда удачного кодирования!
