🐛 Типичные ошибки при работе с кортежами

⚡ Топ-3 ошибки

  • (5) вместо (5,): получается int, а не tuple.
  • Попытка изменить элемент: items[0] = 10 вызовет TypeError.
  • Распаковка не той длины: a, b = (1, 2, 3) вызовет ValueError.

Ошибка 1. Одноэлементный кортеж без запятой

Неверно

single = (5)
print(type(single))

Это число в скобках, а не кортеж.

Верно

single = (5,)
print(type(single))

Запятая показывает Python, что это кортеж.

Ошибка 2. Попытка изменить кортеж

numbers = (10, 20, 30)
# numbers[1] = 40  # TypeError

Кортеж неизменяем. Если нужно менять элементы по индексу, используйте список. Если нужен новый фиксированный набор, создайте новый кортеж.

numbers = (10, 20, 30)
updated = numbers[:1] + (40,) + numbers[2:]
print(updated)

Ошибка 3. Добавление не кортежа

numbers = (1, 2)
# numbers = numbers + (3)  # TypeError

(3) — это int. Для конкатенации нужен другой кортеж.

numbers = (1, 2)
numbers = numbers + (3,)
print(numbers)

Ошибка 4. Неверное количество переменных при распаковке

data = (1, 2, 3)
# a, b = data  # ValueError: too many values to unpack

Используйте столько переменных, сколько элементов, или заберите остаток через *.

data = (1, 2, 3)
a, *rest = data
print(a)
print(rest)

Ошибка 5. index() без проверки наличия

numbers = (10, 20, 30)
# print(numbers.index(40))  # ValueError

Если элемента может не быть, сначала проверьте наличие.

numbers = (10, 20, 30)
target = 40

if target in numbers:
    print(numbers.index(target))
else:
    print("Значение не найдено")

Ошибка 6. Переопределение встроенных имён

numbers = (3, 7, 2)
# max = numbers[0]  # так лучше не называть переменную

Имя max уже занято встроенной функцией Python. Для переменной лучше выбрать max_value.

numbers = (3, 7, 2)
max_value = numbers[0]
print(max_value)

Ошибка 7. Непонимание вложенных изменяемых объектов

Сам кортеж неизменяем, но он может хранить изменяемый объект, например список. Нельзя заменить список в кортеже, но можно изменить содержимое самого списка.

data = ([1, 2], "items")
data[0].append(3)
print(data)
Проверить по документации: это следствие модели объектов Python и различия между неизменяемостью контейнера и изменяемостью вложенного объекта.