Передаются ли параметры в 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 снаружи.
Пояснение кода:
Код показывает два разных сценария.
- При вызове
add_item(nums)параметрlstначинает ссылаться на тот же список, что иnums. - В строке
lst.append(4)изменяется сам список, поэтому изменения видны снаружи. - В строке
lst = [1, 2, 3]имяlstначинает указывать на новый список, но это только локальное переназначение внутри функции. - Переменная
numsпри этом по-прежнему ссылается на исходный список, уже изменённый черезappend.
Код нужен, чтобы показать разницу между изменением объекта и переназначением параметра.
Ключевые моменты:
- В Python не используется чистая передача ни по значению, ни по ссылке.
- В функцию передаётся ссылка на объект, а не его копия.
- Для изменяемых объектов изменения внутри функции могут быть видны снаружи.
- Для неизменяемых объектов, таких как
int,str,tuple, «изменение» обычно означает создание нового объекта. - Переназначение параметра внутри функции не меняет переменную вызывающего кода.
- На собеседовании лучше говорить: «В Python параметры передаются по ссылке на объект».