← Назад к вопросам
Что выведет код: print([1, 2, 3] + [4, 5]) и print([1, 2, 3] * 2)?
2.3 Middle🔥 151 комментариев
#DevOps и инфраструктура#Django
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Операции со списками: конкатенация и повторение
Это простой, но важный вопрос о перегрузке операторов в Python. Одни и те же операторы + и * работают по-разному для разных типов данных.
Вывод кода
print([1, 2, 3] + [4, 5])
# Выведет: [1, 2, 3, 4, 5]
print([1, 2, 3] * 2)
# Выведет: [1, 2, 3, 1, 2, 3]
Объяснение
Оператор + (конкатенация)
+ для списков выполняет конкатенацию (объединение):
list1 = [1, 2, 3]
list2 = [4, 5]
result = list1 + list2
print(result) # [1, 2, 3, 4, 5]
# Это эквивалентно:
list1.extend(list2) # Но + создаёт новый список
Важные особенности:
- Создаёт новый список (не изменяет исходные)
- Требует список с обеих сторон (нельзя
[1, 2] + (3, 4)) - Временная сложность: O(n + m) где n, m — длины списков
a = [1, 2]
b = [3, 4]
c = a + b
print(c) # [1, 2, 3, 4]
print(a) # [1, 2] — не изменилось
# Но это может быть неэффективно
result = []
for item in large_list:
result = result + [item] # Плохо! O(n²)
# Лучше
result = []
for item in large_list:
result.append(item) # O(1) за добавление
Оператор * (повторение)
* для списков выполняет повторение:
list1 = [1, 2, 3]
result = list1 * 2
print(result) # [1, 2, 3, 1, 2, 3]
# Это эквивалентно
result = list1 + list1
print(result) # [1, 2, 3, 1, 2, 3]
# Или в другом порядке
result = 2 * [1, 2, 3]
print(result) # [1, 2, 3, 1, 2, 3]
Важные особенности:
- Число может быть слева или справа:
[1, 2] * 3или3 * [1, 2] - Создаёт новый список
- Если число ≤ 0, результат — пустой список
- Число должно быть целое
print([1, 2] * 3) # [1, 2, 1, 2, 1, 2]
print(3 * [1, 2]) # [1, 2, 1, 2, 1, 2]
print([1, 2] * 0) # []
print([1, 2] * -1) # []
print(["a"] * 5) # ['a', 'a', 'a', 'a', 'a']
Опасность с изменяемыми объектами
ВАЖНО: При повторении мутабельных объектов копируются только ссылки!
# Опасный случай
matrix = [[0] * 3] * 3
print(matrix) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
matrix[0][0] = 1
print(matrix) # [[1, 0, 0], [1, 0, 0], [1, 0, 0]]
# Все строки указывают на ОДИН И ТОТ ЖЕ список!
# Правильно
matrix = [[0] * 3 for _ in range(3)]
matrix[0][0] = 1
print(matrix) # [[1, 0, 0], [0, 0, 0], [0, 0, 0]]
# Ещё пример
data = [[]] * 3 # Три ссылки на ОДИН пустой список
data[0].append(1)
print(data) # [[1], [1], [1]]
# Правильно
data = [[] for _ in range(3)] # Три РАЗНЫХ пустых списка
data[0].append(1)
print(data) # [[1], [], []]
Сравнение с другими типами
Строки:
print("ab" + "cd") # abcd
print("ab" * 3) # ababab
Кортежи:
print((1, 2) + (3, 4)) # (1, 2, 3, 4)
print((1, 2) * 2) # (1, 2, 1, 2)
Словари (НЕ работают):
print({"a": 1} + {"b": 2}) # TypeError
print({"a": 1} * 2) # TypeError
# Для словарей нужно
d1 = {"a": 1}
d2 = {"b": 2}
d1.update(d2) # или {**d1, **d2}
Производительность
Конкатенация списков:
# Медленно — O(n) за каждое слияние
result = [1]
for i in range(1000):
result = result + [i] # Создаёт новый список
# Быстро — O(1) за добавление
result = [1]
for i in range(1000):
result.append(i)
# Или используй extend — O(n) но один раз
result = [1]
result.extend(range(2, 1001))
На собеседовании
Ожидаемый ответ:
[1, 2, 3] + [4, 5]выведет[1, 2, 3, 4, 5]— конкатенация[1, 2, 3] * 2выведет[1, 2, 3, 1, 2, 3]— повторение- Понимание что это новые списки (не in-place операции)
- Знание про опасность с мутабельными объектами при повторении
- Отличие от методов
extend()иappend()
Это базовый вопрос, но хорошие кандидаты знают про ловушку с ссылками при повторении списков с изменяемыми элементами.