Sobes.tech
Назад к вопросам
Middle
12

Передаются ли параметры в Python по значению или по ссылке?

Компании, где спрашивали
ПАО Газпром нефть

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

sobes.tech AI

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

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

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

Python использует модель call by object reference или передачу объекта по ссылке на объект: в функцию передаётся не копия объекта, а ссылка на сам объект. При этом имя параметра внутри функции — это отдельная локальная переменная, которая изначально указывает на тот же объект, что и аргумент снаружи.

Важно различать:

  • мутацию объекта — меняется сам объект;
  • переназначение параметра — меняется только локальная переменная в функции.

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

def add_item(lst):
    lst.append(4)      # меняем сам объект списка
    lst = [1, 2, 3]    # переназначаем локальную переменную

nums = [1, 2, 3]
add_item(nums)

print(nums)  # [1, 2, 3, 4]

Здесь список nums изменился после append, но присваивание lst = [1, 2, 3] не повлияло на переменную nums снаружи.

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

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

  1. При вызове add_item(nums) параметр lst начинает ссылаться на тот же список, что и nums.
  2. В строке lst.append(4) изменяется сам список, поэтому изменения видны снаружи.
  3. В строке lst = [1, 2, 3] имя lst начинает указывать на новый список, но это только локальное переназначение внутри функции.
  4. Переменная nums при этом по-прежнему ссылается на исходный список, уже изменённый через append.

Код нужен, чтобы показать разницу между изменением объекта и переназначением параметра.

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

  • В Python не используется чистая передача ни по значению, ни по ссылке.
  • В функцию передаётся ссылка на объект, а не его копия.
  • Для изменяемых объектов изменения внутри функции могут быть видны снаружи.
  • Для неизменяемых объектов, таких как int, str, tuple, «изменение» обычно означает создание нового объекта.
  • Переназначение параметра внутри функции не меняет переменную вызывающего кода.
  • На собеседовании лучше говорить: «В Python параметры передаются по ссылке на объект».