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

Ответ

В Python используется механизм передачи аргументов, известный как call by object reference (или call by sharing). Это означает, что в функцию передается копия ссылки на объект, а не сам объект или его полная копия.

Поведение зависит от типа данных (изменяемый или неизменяемый):

  1. Неизменяемые типы (immutable): int, str, tuple, frozenset. При попытке изменить такой объект внутри функции создается новый объект, и локальная переменная функции начинает ссылаться на него. Исходный объект вне функции остается без изменений.

    def change_immutable(s):
        # Создается новая строка, и 's' теперь ссылается на нее
        s = s + " world"
        print(f"Внутри функции: {s}") # Внутри функции: hello world
    
    my_string = "hello"
    change_immutable(my_string)
    print(f"Снаружи функции: {my_string}") # Снаружи функции: hello
  2. Изменяемые типы (mutable): list, dict, set. Поскольку функция получает ссылку на тот же самый объект, изменение его внутреннего состояния (например, добавление элемента в список) будет видно и за пределами функции.

    def change_mutable(lst):
        # Объект изменяется по ссылке
        lst.append(4)
        print(f"Внутри функции: {lst}") # Внутри функции: [1, 2, 3, 4]
    
    my_list = [1, 2, 3]
    change_mutable(my_list)
    print(f"Снаружи функции: {my_list}") # Снаружи функции: [1, 2, 3, 4]

Ключевой момент: Оператор присваивания (=) внутри функции всегда создает новую локальную ссылку и никогда не изменяет переменную вне ее области видимости.