В чем ключевые различия между list и tuple в Python и когда какой тип данных выбрать

Ответ

Ключевое различие между list (список) и tuple (кортеж) заключается в изменяемости (mutability).

list (Список)

  • Изменяемый (Mutable): элементы можно добавлять, удалять и изменять после создания.
  • Синтаксис: my_list = [1, 2, 3]
  • Назначение: используется для хранения однородных (одного типа) данных, количество которых может меняться. Например, список пользователей или товаров.

tuple (Кортеж)

  • Неизменяемый (Immutable): после создания кортеж нельзя изменить. Попытка изменить элемент вызовет TypeError.
  • Синтаксис: my_tuple = (1, 2, 3)
  • Назначение: используется для хранения гетерогенных (разных типов) данных, представляющих собой единую структуру. Например, координаты точки (x, y) или запись из базы данных ('John Doe', 30).
  • Преимущества:
    • Работает быстрее, чем list за счет неизменяемости.
    • Может использоваться в качестве ключа словаря, в отличие от списка.

Критерии выбора

Сценарий Рекомендуемый тип Почему?
Коллекция, которая будет изменяться list Требуется гибкость для добавления/удаления элементов.
Хранение фиксированной структуры данных tuple Гарантирует целостность данных (защита от изменений).
Ключи для словаря (dict) tuple Ключи словаря должны быть хешируемыми и неизменяемыми.
Возврат нескольких значений из функции tuple Это стандартная идиома Python для группировки возвращаемых значений.

Пример:

# Список для динамической коллекции
users = ['Alice', 'Bob']
users.append('Charlie') # OK
print(users) # -> ['Alice', 'Bob', 'Charlie']

# Кортеж для неизменяемой структуры (координаты)
point = (10, 20)
# point[0] = 15 # Вызовет TypeError: 'tuple' object does not support item assignment

# Кортеж как ключ словаря
locations = {
    (35.68, 139.69): "Токио",
    (40.71, -74.00): "Нью-Йорк"
}
print(locations[(35.68, 139.69)]) # -> Токио

Ответ 18+ 🔞

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

Вот смотри, есть у тебя list — это как твой бардак в комнате. Захотел — кинул носки на стул, захотел — выкинул пивные банки в окно. Менять можно что угодно, когда угодно. Создаётся в квадратных скобках: [1, 2, 3]. Добавил элемент — append, удалил — pop, переставил — sort. Живи, радуйся, блядь. Идеально для всяких динамических штук: список покупок, который растёт, или очередь из юзеров, которых банят.

А теперь tuple — это уже не бардак, а законсервированная, блядь, реальность. Как фотка в рамке под стеклом. Создал — (1, 2, 3) — и всё, пиши пропало. Ни хуя не изменишь, не добавишь, не удалишь. Попробуешь — получишь TypeError прямо в ебало. "Не-не, браток, — говорит Python, — тут всё зафиксировано, иди нахуй со своими правками".

И в этом, сука, его сила! Во-первых, работает он быстрее, потому что интерпретатор знает: раз менять нельзя, можно не париться с резервированием памяти и прочей хуйнёй. Во-вторых, его можно использовать как ключ в словаре! Представь: {(55.75, 37.61): 'Москва'}. А список так не может — он же изменяемый, ненадёжный, как мартышлюшка.

Так когда что брать? Да вот таблица, смотри, не тупи:

Если тебе надо... Бери... Потому что...
Менять коллекцию на ходу (добавлять, удалять) list Это его родная стихия, блядь.
Сохранить структуру, которую трогать нельзя (координаты, настройки) tuple Защита от дурака (от тебя же самого).
Сделать ключ для словаря tuple Он хешируемый и неизменяемый, в отличие от списка.
Вернуть из функции кучу значений разом tuple Классика жанра: return name, age, salary.

Ну и примеры, чтобы совсем пиздато было:

# Список — тут можно творить любой пиздец
друзья = ['Вася', 'Петя']
друзья.append('Гриша') # Добавили Гришу, ну и хуй с ним
print(друзья) # -> ['Вася', 'Петя', 'Гриша']

# Кортеж — тут уже ни хуя не сделаешь
координаты = (59.93, 30.31)
# координаты[0] = 100 # А вот эту строчку раскомментируешь — получишь TypeError в сраку!

# А вот так кортеж рулит как ключ
столицы = {
    (55.75, 37.61): 'Москва',
    (59.93, 30.31): 'Питер'
}
print(столицы[(59.93, 30.31)]) # -> Питер

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