В чем разница между списком и кортежем?

Разница между списком (list) и кортежем (tuple) — один из важнейших аспектов Python. Эти структуры данных похожи по синтаксису и функциональности, но имеют разные свойства и поведение.

Давайте рассмотрим их подробно:

🔷 1. Основные определения

✅ Список (list)

Список — это изменяемая упорядоченная коллекция элементов, которая может содержать объекты любых типов.

my_list = \[1, "привет", 3.14, \[5, 6\]\]

✅ Кортеж (tuple)

Кортеж — это неизменяемая (immutable) упорядоченная коллекция элементов.

my_tuple = (1, "привет", 3.14, \[5, 6\])

📌 2. Главное отличие: изменяемость

Свойство Список (list) Кортеж (tuple)
Изменяемость ✅ Да — можно менять ❌ Нет — нельзя менять
--- --- ---

▶ Пример со списком:

a = \[1, 2, 3\]
a\[0\] = 99
print(a) # \[99, 2, 3\]

▶ Пример с кортежем:

b = (1, 2, 3)
\# b\[0\] = 99 # ❌ Ошибка: 'tuple' object does not support item assignment

🧠 3. Когда использовать:

Использовать... Когда нужен list Когда лучше tuple
Данные могут изменяться ❌ Не предназначен для изменений
--- --- ---
Фиксированные данные ✅ Например, координаты, RGB и т.д.
--- --- ---
Сериализация или хеширование ❌ (нельзя использовать как ключи словаря) ✅ (если внутри нет изменяемых типов)
--- --- ---
Быстродействие важнее гибкости ✅ tuple работает быстрее
--- --- ---

⚡ 4. Быстродействие

tuple работает быстрее, чем list, потому что он не требует дополнительной памяти для изменений.

import timeit
print(timeit.timeit("\[1, 2, 3, 4\]", number=1000000)) # медленнее
print(timeit.timeit("(1, 2, 3, 4)", number=1000000)) # быстрее

📚 5. Синтаксические различия

Описание Список Кортеж
Обычный синтаксис [1, 2, 3] (1, 2, 3)
--- --- ---
Пустой [] ()
--- --- ---
Один элемент [42] (42,) ← важно запятая!
--- --- ---

🔄 6. Методы списков и кортежей

▶ Методы списка (list):

append(), extend(), insert(), remove(), pop(),
reverse(), sort(), clear(), copy()

Пример:

a = \[1, 2\]
a.append(3) # \[1, 2, 3\]

▶ Методы кортежа (tuple):

count(), index()
t = (1, 2, 2, 3)
print(t.count(2)) # 2
print(t.index(3)) # 3

🧩 7. Вложенные структуры

Кортеж может содержать изменяемые объекты:

t = (1, \[2, 3\])
t\[1\].append(4)
print(t) # (1, \[2, 3, 4\])

❗ Хотя сам кортеж неизменяемый, объекты внутри могут быть изменяемыми.

🧷 8. Можно ли использовать как ключ словаря?

Структура Можно в качестве ключа в dict?
Список ❌ Нет (TypeError)
--- ---
Кортеж ✅ Да (если только содержит неизменяемые элементы)
--- ---
d = {}
d\[(1, 2)\] = "ok" # Работает
\# d\[\[1, 2\]\] = "no" # ❌ Ошибка

💬 Когда использовать tuple, а когда list?

Ситуация Структура
Хранишь координаты (x, y), RGB-цвета tuple
--- ---
Работаешь с данными, которые не должны изменяться tuple
--- ---
Нужно много вставок, удаления, сортировок list
--- ---
Хочешь пройтись циклом и менять значения list
--- ---