Обе концепции вызова по значению и вызова по ссылке очень полезны при управлении памятью, манипулировании данными и даже разработке API.
В некоторых языках программирования данные в аргумент функции можно передавать двумя способами: по значению и по ссылке (адресу).
- Вызов по значению означает передачу значения в аргумент функции. Если в это значение вносятся какие-либо изменения внутри функции, исходное значение вне функции остается прежним.
- В то время как вызов по ссылке означает передачу адреса значения в аргумент функции, если в это значение вносятся какие-либо изменения внутри функции, они также изменяют значение вне функции.
Понимание этих двух концепций очень полезно, поскольку позволяет вам лучше управлять своими данными.
Но я хочу сказать вам одну вещь: в Python нет концепции «вызова по значению», как в таких языках, как C, C++, Java и т. д. Вместо этого он передает ссылку на объект по значению.
Это означает, что вы передаете неизменяемые объекты, такие как целые числа и кортежи, в аргумент функции. Он действует как вызов по значению, поскольку природа неизменяемых объектов предотвращает влияние любых изменений внутри функции на исходные объекты.
Если говорить о вызове по ссылке в Python, то в аргументы функции передаются изменяемые объекты, такие как списки, словари и т.д. Поскольку функция получает ссылку на исходный объект, любая модификация объекта приводит к изменению исходного объекта.
Ваша концепция вызова по значению и ссылке должна быть ясна до сих пор, если нет, не волнуйтесь. Вы поймете это на примерах.
Прежде чем начать, запомните одну вещь: исходное значение не меняется при вызове по значению, но оно меняется при вызове по ссылке. Кроме того, я буду использовать слова «пройти» или «вызов» взаимозаменяемо, в зависимости от контекста.
Передача по ссылке
Как я уже сказал, когда в аргументы функции передаются изменяемые объекты, такие как списки и словари. Любые изменения, внесенные в эти объекты внутри функции с помощью операции, также изменяют исходные объекты вне функции.
Давайте сначала создадим словарь с именем «user_profile», как показано ниже.
user_profile = { 'username': 'Tylor', 'email': ' [email protected]' }
В приведенном выше коде словарь user_profile содержит две пары ключ-значение: имя пользователя и адрес электронной почты в качестве ключей, а Tylor и [email protected] в качестве значений соответственно.
Теперь создайте функцию, которая обновляет электронную почту профиля пользователя, как показано ниже.
def update_user_profile(user_info, user_email): user_info['email'] = user_email.lower().strip() print("Updated email inside function:", user_info['email'])
В приведенном выше коде функция update_user_profile принимает два аргумента: данные пользователя через user_info и новый адрес электронной почты пользователя через user_email, который вы хотите обновить.
Прежде чем вызывать функцию с этими значениями, запишите текущий адрес электронной почты пользователя; теперь давайте вызовем функцию с user_profile и новым адресом электронной почты «[email protected]», как показано ниже.
update_user_profile(user_profile,'[email protected]') print("Email outside function:", user_profile['email'])
Посмотрите на выходные данные, когда вы вызываете функцию update_user_profile, передавая ей словарь user_profile, адрес электронной почты которого вы хотите обновить, и новый адрес электронной почты «[email protected]». Он обновляет как электронные письма внутри, так и вне функции.
Это означает, что он изменяет исходный словарь user_profile вне созданной вами функции.
Передача по значению
При передаче по значению, когда в аргументы функции передаются неизменяемые объекты, такие как целые числа, строки и кортежи. Любые изменения, внесенные в эти объекты внутри функции с помощью операции, не изменяют исходные объекты вне функции.
Чтобы понять эту концепцию, давайте возьмем простой пример.
Создайте значение переменной и инициализируйте его значением 5, как показано ниже.
value = 5
Создайте функцию с именем «дополнение», которая принимает значение и увеличивает его на 1, как показано ниже.
def addition(value): value = value + 1 print('The value inside function',value)
Вызовите функцию, передав созданное вами значение переменной(содержащее 5), как показано ниже.
addition(value) print('The value outside function',value)
Посмотрите на результат, значение вне функции не затрагивается. Он содержит то же значение — 5, но значение в функции увеличивается на единицу, оно включает значение 6.
Здесь, когда вы передаете значение переменной в функцию add (value), передается копия переменной (на самом деле это неизменяемый объект), поэтому внутри функции эта строка value = value + 1 добавляет единицу к копия переменной, а не исходная.
Таким образом, увеличивается только значение переменной внутри функции, а не значение переменной вне функции.
Разница между передачей по значению и по ссылке
Давайте разберемся в Python с передачей по ссылке и передачей по значению.
Передача по ссылке | Передача по значению |
При вызове функции на языке программирования вместо копирования их значений используется адрес переменных; это известно как «вызов по ссылке». | Когда при вызове функции мы передаем значения путем копирования переменных, это называется «Вызов по значениям». |
В этом методе передается сама переменная. | Копия переменной передается при вызове по значению. |
Изменение переменной также влияет на значение переменной вне функции. | Изменения, сделанные в копии переменной, никогда не изменяют значение переменной вне функции. |
Позволяет изменять значения переменных с помощью вызовов функций. | Это не позволяет вам вносить какие-либо изменения в фактические переменные. |
Исходное значение изменяется. | Исходное значение не изменено. |