Ответ
В 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] - изменился!
Ключевые моменты:
- Функция получает ссылку на тот же объект в памяти
- Для неизменяемых типов операция создает новый объект, не затрагивая оригинал
- Для изменяемых типов изменения видны снаружи функции
Как создать копию для изменяемых объектов:
import copy
def safe_modify(lst):
lst_copy = lst.copy() # или copy.deepcopy() для вложенных структур
lst_copy.append(100)
return lst_copy