Обе концепции вызова по значению и вызова по ссылке очень полезны при управлении памятью, манипулировании данными и даже разработке 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'])

Передача по ссылке в Python

Посмотрите на выходные данные, когда вы вызываете функцию 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)

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

Посмотрите на результат, значение вне функции не затрагивается. Он содержит то же значение — 5, но значение в функции увеличивается на единицу, оно включает значение 6.

Здесь, когда вы передаете значение переменной в функцию add (value), передается копия переменной (на самом деле это неизменяемый объект), поэтому внутри функции эта строка value = value + 1 добавляет единицу к копия переменной, а не исходная.

Таким образом, увеличивается только значение переменной внутри функции, а не значение переменной вне функции.

Разница между передачей по значению и по ссылке

Давайте разберемся в Python с передачей по ссылке и передачей по значению.

Передача по ссылке Передача по значению
При вызове функции на языке программирования вместо копирования их значений используется адрес переменных; это известно как «вызов по ссылке». Когда при вызове функции мы передаем значения путем копирования переменных, это называется «Вызов по значениям».
В этом методе передается сама переменная. Копия переменной передается при вызове по значению.
Изменение переменной также влияет на значение переменной вне функции. Изменения, сделанные в копии переменной, никогда не изменяют значение переменной вне функции.
Позволяет изменять значения переменных с помощью вызовов функций. Это не позволяет вам вносить какие-либо изменения в фактические переменные.
Исходное значение изменяется. Исходное значение не изменено.

 

Добавить комментарий