Что происходит, когда переменная передается по значению в Python?

«Что происходит, когда переменная передается по значению в Python?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Python все передается по присваиванию объекта (pass-by-object-reference), но для неизменяемых типов это ведет себя как передача по значению.

Для неизменяемых типов (int, float, str, tuple):

def modify_value(x):
    x = x + 10  # Создается новый объект
    print(f"Inside function: {x}")  # 20

num = 10
modify_value(num)
print(f"Outside function: {num}")  # 10 - оригинал не изменился

Для изменяемых типов (list, dict, set):

def modify_list(lst):
    lst.append(4)  # Изменяет оригинальный объект
    print(f"Inside function: {lst}")  # [1, 2, 3, 4]

my_list = [1, 2, 3]
modify_list(my_list)
print(f"Outside function: {my_list}")  # [1, 2, 3, 4] - изменился!

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

  1. Функция получает ссылку на тот же объект в памяти
  2. Для неизменяемых типов операция создает новый объект, не затрагивая оригинал
  3. Для изменяемых типов изменения видны снаружи функции

Как создать копию для изменяемых объектов:

import copy

def safe_modify(lst):
    lst_copy = lst.copy()  # или copy.deepcopy() для вложенных структур
    lst_copy.append(100)
    return lst_copy