← Назад к вопросам

Зачем нужен метод extend?

2.2 Middle🔥 131 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Метод extend() в Python

metod extend() нужен для добавления всех элементов из итерируемого объекта в список. Это отличается от append(), который добавляет целый объект как один элемент.

Различие между append() и extend()

append() — добавить один элемент

my_list = [1, 2, 3]
my_list.append(4)          # Добавляем число 4
print(my_list)             # [1, 2, 3, 4]

my_list.append([5, 6])     # Добавляем СПИСОК как один элемент
print(my_list)             # [1, 2, 3, 4, [5, 6]]
                            # Вложенный список!

# Доступ к элементу
print(my_list[4])          # [5, 6] — это список
print(my_list[4][0])       # 5 — элемент из вложенного списка

extend() — добавить все элементы

my_list = [1, 2, 3]
my_list.extend([4, 5])     # Добавляем ВСЕ элементы из списка
print(my_list)             # [1, 2, 3, 4, 5]
                            # Плоский список

# Доступ к элементу
print(my_list[3])          # 4 — прямой доступ
print(my_list[4])          # 5

Производительность

import timeit

# append() в цикле (медленно: пересоздает список каждый раз)
code_append = '''
result = []
for item in range(1000):
    result.append(item)
'''

# extend() один раз (быстро)
code_extend = '''
result = []
result.extend(range(1000))
'''

print(timeit.timeit(code_append, number=1000))   # ~0.05 секунд
print(timeit.timeit(code_extend, number=1000))   # ~0.01 секунд

# extend() в 5 раз БЫСТРЕЕ!

Когда использовать extend()

1. Объединение двух списков

# Плохо: append()
list1 = [1, 2, 3]
list2 = [4, 5, 6]
for item in list2:
    list1.append(item)  # Долго и неэффективно
print(list1)  # [1, 2, 3, 4, 5, 6]

# Хорошо: extend()
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)  # Быстро и понятно
print(list1)  # [1, 2, 3, 4, 5, 6]

# Или даже лучше: создать новый список
result = list1 + list2  # [1, 2, 3, 4, 5, 6]
result = [*list1, *list2]  # Распаковка

2. Добавление результатов поиска

def find_answers(query):
    """Возвращает список ответов"""
    results = []
    for keyword in query:
        # find() возвращает список
        results.extend(database.find(keyword))
    return results

# Альтернатива с append() будет создавать вложенные списки

3. Агрегация данных из нескольких источников

class AnsweringSystem:
    def get_all_answers(self):
        all_answers = []
        
        # Получаем ответы из разных источников
        all_answers.extend(self.db.get_correct_answers())
        all_answers.extend(self.cache.get_cached_answers())
        all_answers.extend(self.memory_store.get_recent())
        
        return all_answers

4. Расширение конфигураций

config = {
    'handlers': [],
    'middleware': []
}

# Добавляем middleware из плагинов
for plugin in load_plugins():
    config['middleware'].extend(plugin.get_middleware())

for plugin in load_plugins():
    config['handlers'].extend(plugin.get_handlers())

Различные типы данных с extend()

# extend() работает с любым итерируемым объектом
my_list = [1, 2, 3]

my_list.extend([4, 5])           # List
my_list.extend((6, 7))           # Tuple
my_list.extend({8, 9})           # Set
my_list.extend(range(10, 12))    # Range
my_list.extend('ab')             # String (добавляет по символам!)

print(my_list)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 'a', 'b']

Опасность: extend() со строками

# Осторожно!
text_list = ['Hello']
text_list.extend('World')
print(text_list)  # ['Hello', 'W', 'o', 'r', 'l', 'd']
                  # Строка разбита по символам!

# Правильно: используй append() или []
text_list = ['Hello']
text_list.append('World')
print(text_list)  # ['Hello', 'World']

# Или
text_list = ['Hello']
text_list.extend(['World'])
print(text_list)  # ['Hello', 'World']

Практический пример: тест по вопросам

class QuestionSet:
    def __init__(self):
        self.questions = []
    
    def add_from_file(self, filepath):
        """Добавить вопросы из файла"""
        questions = load_questions_from_file(filepath)
        self.questions.extend(questions)  # Правильно: развернуть список
    
    def add_from_database(self, category):
        """Добавить вопросы из БД"""
        questions = database.get_by_category(category)
        self.questions.extend(questions)
    
    def get_shuffled(self):
        """Перемешать и вернуть"""
        import random
        shuffled = self.questions.copy()
        random.shuffle(shuffled)
        return shuffled

# Использование
quiz = QuestionSet()
quiz.add_from_file('easy_questions.json')
quiz.add_from_file('medium_questions.json')
quiz.add_from_database('hard')

print(len(quiz.questions))  # Все вопросы в плоском списке

Сравнение методов объединения

list1 = [1, 2, 3]
list2 = [4, 5, 6]

# Способ 1: append() в цикле
for item in list2:
    list1.append(item)  # Медленно

# Способ 2: extend()
list1.extend(list2)  # Быстро

# Способ 3: оператор +
result = list1 + list2  # Создает новый список (не изменяет оригинал)

# Способ 4: распаковка
result = [*list1, *list2]  # Создает новый список

# Способ 5: sum() (НЕ РЕКОМЕНДУЕТСЯ)
result = sum([list1, list2], [])  # Очень медленно O(n^2)

Когда extend() не нужен

# Если хочешь создать новый список
list1 = [1, 2, 3]
list2 = [4, 5, 6]

result = list1.copy()  # Сначала скопируем
result.extend(list2)   # Потом расширим

# Или проще
result = list1 + list2  # Не изменяет оригиналы

Вывод

extend() нужен для:
  • Добавления всех элементов из итерируемого объекта
  • Объединения списков (быстро)
  • Агрегации данных из нескольких источников
  • Расширения коллекций

Правило: если хочешь добавить один элемент → append(), если хочешь добавить много элементов → extend().