Разница между списком (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 |
| --- | --- |