Расскажите, какой в питоне механизм передачи параметров



Ответ



В питоне используется передача параметров по ссылке. Если изменить параметр внутри функции, то это отразится на выводе функции. Однако, если использовать в качестве параметров литералы (строки, числа, кортежа), то они передаются по значению (потому что они не изменяемые).



Рассмотрим следующий пример:



def foo(x):

x = 4



a = 3

foo(a)

print(a)

# 3



Функция вызывается, но изменения оказанные на переменную a больше не действую после возврата из функции, ведь a всё ещё равна 3. Поэтому может показаться, что используется передача по значению, но это не так. Python не копирует значения параметров при вызове функции. Если мы рассмотрим другую функцию:



def clearly_not_pass_by_value(my_list):

my_list[0] = 42



l = [1, 2, 3]

clearly_not_pass_by_value(l)

print(l)

# [42, 2, 3]




— то мы четко видим, что элемент исходного списка l был изменен после вызова функции.



При передачи по ссылке в момент вызова функции передаются адреса переменных, причем с адресами работают так, как если бы это была обычная переменная (поэтому не нужно дополнительно проводить разыменование, как это делается в Си). Такая модель подразумевает, что исходные переменные и параметры функции — это одни и те же объекты. Изменяя параметры в теле функции, вы изменяете их и в вызывающем контексте.



@python_job_interview