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

Ответ

Основное различие заключается в изменяемости (mutability).

  • Список (list) — это изменяемая (mutable) последовательность. После создания можно добавлять, удалять и изменять элементы.
  • Кортеж (tuple) — это неизменяемая (immutable) последовательность. После создания его содержимое изменить нельзя.

Синтаксис:

my_list = [1, 2, 3]  # Квадратные скобки
my_tuple = (1, 2, 3) # Круглые скобки (или просто 1, 2, 3)

Практические последствия и примеры:

  1. Изменение элементов:

    my_list = [1, 2, 3]
    my_list[0] = 99  # Допустимо. Теперь список [99, 2, 3]
    
    my_tuple = (1, 2, 3)
    my_tuple[0] = 99  # Вызовет TypeError: 'tuple' object does not support item assignment
  2. Использование в качестве ключа словаря: Из-за неизменяемости кортежи могут быть ключами словаря, а списки — нет.

    valid_dict = {(1, 2): "coordinates"}  # Корректно
    invalid_dict = {[1, 2]: "list"}       # Вызовет TypeError: unhashable type: 'list'
  3. Производительность и намерения: Кортежи обычно работают немного быстрее и занимают меньше памяти. Их использование сигнализирует о том, что данные являются константными (например, точка (x, y), запись из БД). Списки предназначены для динамических коллекций.

Резюме: Используйте список, когда коллекция должна меняться. Используйте кортеж для фиксированных наборов данных, которые должны оставаться неизменными.

Ответ 18+ 🔞

Давай разберём эту дичь, чтобы ты наконец перестал путать одно с другим, как мартышлюшка с гранатой. Основная разница — в изменяемости, или, на нашем языке, в том, можно ли это дело по ходу дела перетряхнуть.

  • Список (list) — это как твой бардак в комнате: положил, убрал, переставил, выкинул. Полная изменяемость, делай что хочешь.
  • Кортеж (tuple) — это как застывший в янтаре комар или твой первый тату-хуй с горы на плече: раз сделал — нихуя не изменишь. Неизменяемая штука.

Как выглядят:

my_list = [1, 2, 3]  # Квадратные скобки, всё просто
my_tuple = (1, 2, 3) # Круглые скобки. А можно и так: 1, 2, 3 — и всё равно кортеж, ёпта.

А теперь на живых примерах, где собака зарыта:

  1. Попытка что-то поменять:

    my_list = [1, 2, 3]
    my_list[0] = 99  # Да без проблем! Теперь список — [99, 2, 3]. Живи, радуйся.
    
    my_tuple = (1, 2, 3)
    my_tuple[0] = 99  # А вот тут тебе Python прямо в сраку: TypeError! Мол, 'tuple' object does not support item assignment. То есть, сиди и не рыпайся, чувак.
  2. Ключ в словаре — дело серьёзное. Тут кортеж выигрывает вчистую, потому что он неизменный и надёжный, как швейцарские часы. А список — ненадёжный распиздяй.

    valid_dict = {(1, 2): "координаты"}  # Всё ок, кортеж — он как паспорт, не перепишешь.
    invalid_dict = {[1, 2]: "список"}    # А это уже пиздец: TypeError! Говорит, список — тип 'unhashable'. То есть, доверия к нему — ноль ебать.
  3. Скорость и намёки. Кортежи обычно чуть шустрее и памяти жрут меньше. А главное — они как сигнал: «Эй, чувак, это фиксированный набор данных, точка (x, y), константа, не трогай!». Список же кричит: «Я динамический! Кидай сюда ещё, убирай отсюда, делай со мной что хочешь!».

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