Sobes.tech
Назад к вопросам
Junior — Middle
64

Как изменяются объекты изменяемых типов данных при их передаче в функцию как аргументы?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

В Python в функцию передаётся ссылка на объект, а не копия самого объекта. Поэтому изменяемый объект можно изменить внутри функции, и изменения будут видны снаружи. Если же внутри функции переменной присвоить новый объект, исходный аргумент снаружи не изменится.

Определение:

Изменяемые типы данных — это объекты, которые можно менять "на месте" без создания нового объекта: например, list, dict, set. При передаче такого объекта в функцию в переменной параметра оказывается та же самая ссылка на тот же объект. Поэтому операции, которые меняют объект на месте, влияют на исходный объект вне функции.

Важно различать изменение объекта и переназначение переменной. Если функция вызывает метод, меняющий объект, — меняется сам аргумент. Если функция присваивает параметру новый объект, меняется только локальная переменная внутри функции.

Пример использования:

def add_item(items):
    items.append("new")   # изменяем объект на месте

def rebind_items(items):
    items = ["other"]     # создаём новый объект и привязываем к нему локальную переменную

data = [1, 2, 3]

add_item(data)
print(data)   # [1, 2, 3, 'new']

rebind_items(data)
print(data)   # [1, 2, 3, 'new']

Пояснение кода:

Код показывает два разных сценария.

  1. В add_item(items) вызывается append, а это метод, который изменяет список на месте. Так как items и data ссылаются на один и тот же список, после вызова список data тоже изменится.

  2. В rebind_items(items) параметру items присваивается новый список. Это не меняет исходный список data, а только переназначает локальную переменную items внутри функции.

Ключевые моменты:

  • В Python аргументы передаются по ссылке на объект, а не как полная копия.
  • Изменяемые объекты list, dict, set можно менять внутри функции, и это отразится снаружи.
  • Методы, меняющие объект на месте, влияют на исходный аргумент.
  • Простое присваивание внутри функции не изменяет объект, который передали снаружи.
  • Для защиты от изменений используют копирование, если нужно работать с данными изолированно.