Передача по ссылке против значения в Python

Pass Reference Vs



Зная Python, вы можете найти случаи, когда функции не изменяют аргументы в одном месте, как вы ожидали, особенно если вы знакомы со многими другими компьютерными языками. Многие языки используют аргументы метода как ссылки, определенные как передача по ссылке текущим переменным. Если вы опытный разработчик Python, который хочет понять особый способ Python обработки аргументов метода, то это руководство действительно для вас.

Python поддерживает передачу по ссылке на объект

Передача по ссылке и передача по значению, несомненно, являются двумя наиболее известными и легко понятными способами передачи параметров между языками программирования. К сожалению, Python не является «передачей по объектной ссылке», ни передачей по значению, ни передачей по ссылке, часто называемой вызовом по ссылке на объект или вызовом по совместному использованию. Полезно более внимательно изучить саму концепцию, разбив ее на сегменты, пока вы погружаетесь в технические особенности передачи по ссылке:







Проходить: это означает снабжение метода аргументом.



По ссылке: это означает, что аргумент, который вы передаете методу, относится к переменной, которая теперь находится в хранилище, а не к другой реплике этой переменной.



Когда вы назначаете методу ссылку на определенную переменную, переменная, которой она соответствует, будет явно зависеть от всех операций с этой ссылкой. Теперь давайте рассмотрим пример того, как это работает на практике. В этом примере мы определили переменную ' злой' имеющий ценность 4 . В этом сценарии переменная ' злой' не был изменен вместо него. Python, похоже, обрабатывает ваш предоставленный аргумент вместо ссылки на текущую переменную как автономное значение.





Означает ли это, что Python перемещает аргументы не по ссылке, а по значению? Python перемещает аргументы через присваивание, поэтому ни по ссылке, ни по значению. Логика здесь двоякая:



В настоящее время передаваемый параметр является указателем на объект. Некоторые типы данных изменяемы, а некоторые неизменяемы.

Если мы переместим изменяемый объект в функцию, функция получит ссылку на тот же самый объект, так что вы можете изменить все это к удовлетворению вашей души; однако внешняя область ничего не узнает, прежде чем вы снова присоединитесь к ссылке в функции. Когда вы закончите, внешняя ссылка будет нацелена только на реальный объект. Если вы перемещаете неизменяемый объект в функцию, внешняя ссылка всегда не может быть повторно связана, и вы не можете просто изменить объект. Чтобы упростить задачу, давайте разберемся по порядку.

Пропустить по ссылке

Прежде всего, вы должны понимать, что переменная 'mylist' сама по себе не является списком, а относится к списку, имеющему значения. Вы можете назвать переменную mylist контейнером, в котором есть значения. Значения списка являются объектами. Переменная «mylist» была прямо передана в функцию вместе с ее содержимым.

И список, и мой список кажутся одной и той же переменной хранилища в приведенном ниже примере кода и, следовательно, применяются к одному и тому же объекту хранилища. Вот почему на выходе печатается «Саид».

Любое действие, выполненное с переменной или сущностью, будет немедленно отражено в вызывающем методе. Метод может полностью изменить значение переменной и направить его на совершенно отдельный объект. Как вы можете видеть в функции «set_list», мы изменили содержимое списка и напечатали полностью новый список с элементом «Aqsa». Это потому, что мы вернули измененный список и распечатали его в той же строке, что и вызывающий.

Этот метод также может перераспределять элементы переменной для достижения того же результата, что и ниже. Вы можете видеть, что мы добавили новое значение в список, и это изменение было отражено. Мы добавили уникальную строку к списку и вернули ее вызывающей стороне. В заключение следует отметить, что метод и вызывающий объект использовали одну и ту же переменную и объект на протяжении всего отношения передачи.

Передавать по значению

При передаче по значению методу предоставляется дубликат объекта аргумента, который ему назначает вызывающий объект. Это гарантирует, что исходный элемент останется неизменным, а все сделанные изменения сохранятся в отдельных ячейках памяти в реплике того же объекта.

Это в равной степени справедливо для любых операций, выполняемых с помощью метода над переменной или сущностью. Дубликаты переменных и объектов в области действия вызывающего метода полностью разделены для их обобщения.

Передать объект по ссылке

В этой ситуации, поскольку Python отличается, методы Python получают очень похожую ссылку на объект в хранилище, на которую ссылается вызывающий объект. И наоборот, метод не получает переменную mylist (контейнер). Вызывающий метод хранит тот же объект; метод генерирует собственный контейнер и генерирует совершенно новый индекс для своего собственного, как при передаче по значению.

Вызывающий и метод говорят об одном и том же объекте в хранилище, но когда добавленный метод применяет внешний элемент к списку, вызывающая сущность изменяется. У них несколько ярлыков, но это одно и то же. Обе переменные содержат очень похожий объект. В этом смысл его отношения к движению объекта. В хранилище метод и вызывающий объект используют аналогичный объект, но улавливают их с помощью нескольких переменных. Переменная вызывающего объекта (контейнер) не будет изменена никакими модификациями, внесенными в переменную метода (контейнер); изменяются только данные или контент.

Заключение

Python работает независимо от языков, которые принимают перемещение по ссылке или значению аргументов. Аргументы метода - это локальные переменные, которые были назначены каждому значению, переданному методу. Но это по-прежнему не мешает вам получить те же результаты, что и на других языках, при передаче аргументов по доверенности.