Сравнение структур данных: списки и кортежи в Python

Раздел: Основы Python -> Структуры данных

Основные различия между списками и кортежами

Списки (list) и кортежи (tuple) являются встроенными последовательностями в Python, но имеют принципиальное отличие: изменяемость. Список может быть изменен после создания, кортеж - нет. Это влияет на производительность, использование в качестве ключей словаря и доступные методы.


# Создание списка и кортежа
my_list = [1, 2, 3]
my_tuple = (1, 2, 3)
print(type(my_list))  # 
print(type(my_tuple)) # 

значения списка числа python (итерация по значениям списка чисел в python)

Индексация и срезы работают одинаково, но список поддерживает методы добавления/удаления (append, pop), а кортеж - нет.


# Изменение списка
my_list.append(4)   # [1,2,3,4]
my_list[0] = 10      # [10,2,3,4]

# Попытка изменить кортеж вызовет ошибку:
# my_tuple[0] = 10   # TypeError: 'tuple' object does not support item assignment

словарь set python (словарь и set в python)

Типичная ошибка:

При попытке изменить элемент кортежа возникает TypeError. Решение - либо создать новый кортеж, либо использовать список, если требуется изменять данные.

Как создать список или кортеж с одним элементом?

Кортеж с одним элементом требует запятую после значения:


single_list = [1]
single_tuple = (1,)   # запятая обязательна
print(type(single_tuple))  # 

Python dict set (словарь и множество в python)

Ошибка:

Если запятую опустить ((1)), будет создано целое число, а не кортеж.

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

Кортеж может быть ключом словаря, потому что он хешируем (неизменяем). Список использовать нельзя.


my_dict = {('a', 1): 'value'}  # кортеж как ключ
# my_dict = {[1,2]: 'value'}   # TypeError: unhashable type: 'list'

типы структур python (типы структур данных в python)

Проблема:

Если кортеж содержит изменяемые элементы (например, список), он перестает быть хешируемым.

Как выполнить распаковку последовательности?

Распаковка работает одинаково для списков и кортежей:


a, b, c = [1, 2, 3]
x, y, z = (4, 5, 6)

кортеж чисел python (кортеж чисел в python)

Используется для возврата нескольких значений из функции (обычно кортеж).

Какие методы доступны для списка, но отсутствуют у кортежа?

Список имеет append, extend, insert, remove, pop, sort, reverse и другие. Кортеж - только count и index.


my_list = [3, 1, 2]
my_list.sort()
print(my_list)  # [1, 2, 3]

my_tuple = (3, 1, 2)
# my_tuple.sort()  # AttributeError
- последовательности в python и способы их реализации (последовательности в python и способы их реализации)
- программы с массивами на python (программы с массивами на python)
- Python пар (пары (ключ-значение) в python)

Расширенные примеры работы со списками и кортежами

Сравнение производительности создания и итерации

Пример

import timeit

# Создание списка и кортежа
time_list = timeit.timeit(stmt='[1,2,3,4,5]', number=1000000)
time_tuple = timeit.timeit(stmt='(1,2,3,4,5)', number=1000000)
print(f"Список: {time_list:.5f} сек; Кортеж: {time_tuple:.5f} сек")
Список: 0.06234 сек; Кортеж: 0.02345 сек

Кортежи создаются быстрее благодаря меньшему объему памяти.

Использование кортежа как аргумента функции с распаковкой

Пример

def sum_three(a, b, c):
    return a + b + c

values = (10, 20, 30)
result = sum_three(*values)  # распаковка кортежа
print(result)  # 60

Вложенные структуры и изменяемость элементов кортежа

Пример

tuple_with_list = ([1, 2], 'text')
tuple_with_list[0].append(3)  # изменяем список внутри кортежа
print(tuple_with_list)  # ([1, 2, 3], 'text')

# Сам кортеж остается неизменным, но содержимое списка меняется

Преобразование между списком и кортежем

Пример

my_list = [4, 5, 6]
converted_tuple = tuple(my_list)
print(converted_tuple)  # (4, 5, 6)

my_tuple = (7, 8, 9)
converted_list = list(my_tuple)
print(converted_list)  # [7, 8, 9]

Срез и копирование

Пример

original_list = [0, 1, 2, 3, 4]
sliced_list = original_list[1:3]
print(sliced_list)  # [1, 2]

original_tuple = (0, 1, 2, 3, 4)
sliced_tuple = original_tuple[1:3]
print(sliced_tuple)  # (1, 2)

# Срез создает новый объект, для списка это поверхностная копия

Множественное присваивание с использованием кортежа (и списка)

Пример

point = (10, 20)
x, y = point
print(f"x={x}, y={y}")

# Обмен значений без временной переменной
a, b = 1, 2
a, b = b, a
print(a, b)  # 2 1

Генераторы списков и кортежей

Пример

squares_list = [x**2 for x in range(5)]
print(squares_list)  # [0, 1, 4, 9, 16]

# Для кортежа нет литерала генератора, нужно явное преобразование
squares_tuple = tuple(x**2 for x in range(5))
print(squares_tuple)  # (0, 1, 4, 9, 16)

Использование кортежей в качестве констант и для иммутабельных данных

Пример

DAYS_OF_WEEK = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
# Попытка изменить кортеж невозможна, что защищает данные от случайного изменения

Разница между списками и кортежами в Python - comments

En
Python разница списков (python)