В чем разница между кортежем (tuple) и списком (list) в Python?

Ответ

Основное отличие — изменяемость (mutability), что влечёт за собой различия в использовании и производительности.

Характеристика Список (list) Кортеж (tuple)
Изменяемость Изменяемый (mutable). Элементы можно изменять, добавлять, удалять. Неизменяемый (immutable). После создания элементы изменить нельзя.
Синтаксис Квадратные скобки: [1, 2, 3] Круглые скобки (часто опциональны): (1, 2, 3) или 1, 2, 3
Производительность Медленнее при итерации, занимает больше памяти из-за накладных расходов на изменение. Быстрее, занимает меньше памяти, так как структура фиксирована.
Использование Для коллекций, которые могут меняться (динамические данные). Для константных коллекций (ключи словаря, возврат нескольких значений из функции).
Хэшируемость Не хэшируем (не может быть ключом словаря). Хэшируем, если все его элементы хэшируемы (может быть ключом словаря).

Примеры:

# Список — можно изменить
my_list = [1, 2, 3]
my_list[0] = 10      # OK: [10, 2, 3]
my_list.append(4)    # OK: [10, 2, 3, 4]

# Кортеж — изменить нельзя
my_tuple = (1, 2, 3)
# my_tuple[0] = 10   # TypeError: 'tuple' object does not support item assignment

# Практическое применение кортежа
def get_user_info(user_id):
    # Возврат нескольких значений как единой неизменяемой структуры
    name = "Alice"
    role = "Admin"
    return (user_id, name, role)  # или просто return user_id, name, role

# Использование как ключа словаря (только если элементы хэшируемы)
cache = {}
key = ("api", "v1", 123)
cache[key] = "cached_data"

Ответ 18+ 🔞

А, ну вот, опять про эти списки и кортежи. Сидишь такой, пишешь код, и тут бац — надо выбрать, в чём данные хранить. А разница-то, блядь, проще некуда, но пока сам не обожжёшься, нихуя не запомнишь.

Смотри, вся суть в одной характеристике — изменяемость (mutability). От неё, как от печки, все остальные пляски идут. И производительность, и использование, и вообще всё.

Характеристика Список (list) Кортеж (tuple)
Изменяемость Изменяемый (mutable). Тут можно всё: поменять элемент, добавить, удалить — полный бардак, но контролируемый. Неизменяемый (immutable). Создал — и всё, приехали. Как отлили в граните. Попробуй изменить — получишь TypeError прямо в лицо.
Синтаксис Квадратные скобки: [1, 2, 3]. Всё честно. Круглые скобки, но часто их можно и не ставить: (1, 2, 3) или просто 1, 2, 3.
Производительность Чуть медленнее, памяти жрёт больше. Ну так и понятно — он же всегда готов к тому, что ты в него ещё чего-нибудь впендюришь, места про запас держит. Быстрее, памяти меньше. А чему тут удивляться? Структура фиксированная, никаких сюрпризов, всё предсказуемо.
Использование Для всего, что может и должно меняться. Список пользователей, лог событий, корзина в интернет-магазине — тут твой выбор. Для вещей постоянных. Ключи в словаре, возврат нескольких значений из функции, какие-нибудь константные наборы вроде ('R', 'G', 'B').
Хэшируемость Не хэшируем, ёпта. В ключи словаря его не запихнёшь — он же может измениться, доверия к нему ноль ебать. Хэшируем, если все элементы внутри тоже хэшируемы. А значит, может спокойно быть ключом. Надёжный пацан.

Ну и примеры, чтобы вообще всё стало ясно, как божий день:

# Список — тут полная воля
my_list = [1, 2, 3]
my_list[0] = 10      # Без проблем: [10, 2, 3]
my_list.append(4)    # Запихнули четвёрку: [10, 2, 3, 4]
# my_list — это как твой рабочий стол: вечно бардак, но ты знаешь, где что лежит.

# Кортеж — тут дисциплина
my_tuple = (1, 2, 3)
# my_tuple[0] = 10   # А вот это уже НИЗЯ. TypeError тебе в сраку. Создал — терпи.

# Где это реально пригождается? Да везде!
def get_user_info(user_id):
    # Функция возвращает кучу всего разом. И чтобы это "всё" было одним неделимым куском — кортеж в руки.
    name = "Alice"
    role = "Admin"
    return (user_id, name, role)  # Скобки можно и не писать, но суть та же.

# Или вот, ключ в словаре. Только хэшируемое.
cache = {}
key = ("api", "v1", 123)  # Кортеж из строк и числа — всё хэшируемо.
cache[key] = "cached_data"  # Идеально. Попробуй сделать ключом список — получишь пиздюлину от интерпретатора.

Короче, если тебе нужно что-то гибкое, что будет расти, меняться и пульсировать — бери список. Если тебе нужна гарантия, что данные останутся в том виде, в котором ты их создал, и ты хочешь speed и надёжность — кортеж твой выбор. Всё просто, я тебе верю, чувак.