← Назад к вопросам
В чем разница между блендингом и случайным лесом?
2.3 Middle🔥 91 комментариев
#Машинное обучение
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
В чем разница между списком и кортежем в Python?
Список и кортеж — основные структуры данных в Python. Главное отличие: список изменяемый, кортеж неизменяемый.
Быстрое сравнение
Список (list): Изменяемый (mutable) [1, 2, 3]
Кортеж (tuple): Неизменяемый (immutable) (1, 2, 3)
Основные отличия
# Создание
my_list = [1, 2, 3]
my_tuple = (1, 2, 3)
# Изменение
my_list[0] = 100 # ✓ Работает
my_tuple[0] = 100 # ❌ TypeError: 'tuple' object does not support item assignment
my_list.append(4) # ✓ Работает
my_tuple.append(4) # ❌ AttributeError: 'tuple' object has no attribute 'append'
Почему это важно
Список (list):
- Можно добавлять, удалять, изменять элементы
- Медленнее (больше памяти и операций)
- Не может быть ключом словаря
- Не может быть элементом set
Кортеж (tuple):
- Зафиксирован после создания
- Быстрее (оптимизирован Python)
- Может быть ключом словаря (hashable)
- Может быть элементом set
Операции со списком
numbers = [1, 2, 3]
# Добавление
numbers.append(4) # [1, 2, 3, 4]
numbers.insert(0, 0) # [0, 1, 2, 3, 4]
numbers.extend([5, 6]) # [0, 1, 2, 3, 4, 5, 6]
# Удаление
numbers.remove(3) # Удаляет значение
numbers.pop(0) # Удаляет по индексу, возвращает
# Изменение
numbers[0] = 999 # [999, 1, 2, 3, 4, 5, 6]
Операции с кортежем
numbers = (1, 2, 3)
# Большинство операций невозможны
numbers.append(4) # ❌ Ошибка
numbers[0] = 999 # ❌ Ошибка
# Но срезы работают
print(numbers[0:2]) # (1, 2)
# Конкатенация (создает новый кортеж)
new_tuple = numbers + (4, 5) # (1, 2, 3, 4, 5)
Использование в словарях
# Кортеж как ключ (OK)
d = {
(1, 2): 'point A',
(3, 4): 'point B'
}
print(d[(1, 2)]) # 'point A'
# Список как ключ (ERROR)
d = {
[1, 2]: 'point A' # ❌ TypeError: unhashable type: 'list'
}
Использование в set
# Кортеж в set (OK)
s = {(1, 2), (3, 4), (1, 2)}
print(s) # {(1, 2), (3, 4)}
# Список в set (ERROR)
s = {[1, 2], [3, 4]} # ❌ TypeError: unhashable type: 'list'
Performance
import timeit
# Создание
t_list = timeit.timeit('[1, 2, 3, 4, 5]', number=1000000)
t_tuple = timeit.timeit('(1, 2, 3, 4, 5)', number=1000000)
print(f"list: {t_list:.3f}s")
print(f"tuple: {t_tuple:.3f}s")
# tuple обычно в 2-3x быстрее
# Доступ к элементу
t_list = timeit.timeit('x = my_list[2]', setup='my_list=[1,2,3,4,5]', number=1000000)
t_tuple = timeit.timeit('x = my_tuple[2]', setup='my_tuple=(1,2,3,4,5)', number=1000000)
# Примерно одинаково
Когда использовать что
Список (list):
- Когда данные могут меняться
- Коллекция однородных элементов
- Нужны операции добавления/удаления
todos = ['купить молоко', 'позвонить другу']
todos.append('помыть машину')
prices = [10.5, 20.0, 15.75]
prices[0] = 11.0
Кортеж (tuple):
- Когда данные фиксированы
- Координаты, точки (x, y, z)
- Ключи словаря, элементы set
- Возвращаемые значения из функции
# Координаты (не должны меняться)
point = (10, 20)
coordinates = [(1, 2), (3, 4), (5, 6)]
# Ключ словаря
cache = {(user_id, date): result}
# Возврат из функции (unpacking)
def get_user():
return ('Alice', 30, 'NYC')
name, age, city = get_user()
# Set уникальных точек
unique_points = {(1, 2), (3, 4), (1, 2)}
Распаковка (unpacking)
# Список
[a, b, c] = [1, 2, 3]
a, b, c = [1, 2, 3] # Не нужны скобки
# Кортеж
(a, b, c) = (1, 2, 3)
a, b, c = (1, 2, 3) # Не нужны скобки
# В функциях
def func():
return (10, 20, 30)
x, y, z = func() # Кортеж автоматически распаковывается
# Обмен переменных
a, b = b, a # Работает через кортеж!
Изменяемые элементы в кортеже
# Кортеж с изменяемым элементом (список)
t = (1, 2, [3, 4, 5])
# Сам кортеж неизменяемый
t[0] = 100 # ❌ Ошибка
# Но список внутри кортежа изменяемый!
t[2].append(6) # ✓ Работает
print(t) # (1, 2, [3, 4, 5, 6])
# Это запутанно! Избегай этого.
named tuple (специальный кортеж)
from collections import namedtuple
# Кортеж с именованными полями
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x) # 10
print(p.y) # 20
print(p[0]) # 10 (можно как обычный кортеж)
# Преимущества: читаемость + неизменяемость
Чек-лист
- ✓ list — изменяемый, используй когда данные меняются
- ✓ tuple — неизменяемый, используй для фиксированных данных
- ✓ tuple — hashable, может быть ключом dict и элементом set
- ✓ tuple — быстрее, используй для production когда speed важна
- ✓ namedtuple — когда нужна семантика без класса
- ✓ распаковка — обе структуры поддерживают, очень полезно
Вывод
Список:
data = [1, 2, 3]
data[0] = 999 # Можно менять
data.append(4) # Можно добавлять
Кортеж:
data = (1, 2, 3)
data[0] = 999 # Нельзя менять
data = data + (4,) # Только конкатенация (новый объект)
Выбор между ними зависит от того, нужны ли изменения после создания.