Автор оригинала: Shubham Sayon.
Резюме: Переменные – это Прошло по ссылке объекта в питоне. Поэтому Музные объекты являются пропущено по ссылке в то время как неизменные объекты являются пропущено по значению в питоне. Пройти неизменные объекты по ссылке, вы можете вернуть и переназначить значение переменной , или передать его в словаре/список или Создайте класс и используйте собственную переменную для справки.
Проблема: Как пройти переменную посредством ссылки в Python?
Чтобы использовать функции и классы в Python или любом другом языке программирования, чрезвычайно важно, чтобы мы понимаем, как работает функция вызова, основанные на A Позвоните по ссылке или Вызов по значению или Позвоните по объекту Ссылка Отказ Давайте обсудим эти концепции один за другим, прежде чем мы достигнем окончательного решения.
Основы звонка по стоимости
В Вызов по значению Метод , значение аргумента копируется в параметр функции. Следовательно, любые изменения, внесенные на параметр внутри называемой функции, не отражены в фактических параметрах функции вызывающего абонента, потому что переменная внутри называемой функции и функции вызывающего абонента относится к двум различным местам в памяти.
Пример:
def func(): a = 10 print("Before Function call value of a = ",a) increment(a) print("After Function call is over value of a = ",a) print("Identity of a in func() is ",id(a)) def increment(k): a = k+10 print("Inside function call Value of a = ",a) print("Identity of a in increment() is ",id(a)) return a func()
Выход:
Before Function call value of a = 10 Inside function call Value of a = 20 Identity of a in increment() is 140578841094464 After Function call is over value of a = 10 Identity of a in func() is 140578841094144
Основы звонка посредством ссылки
В связи с помощью ссылочного метода адрес аргумента передается на названную функцию. Таким образом, мы ссылаемся на адрес переменной в этом случае, и любые изменения, выполненные в параметре внутри функции, также отражены вне функции.
Позвоните по ссылке поддерживаются языками, такие как Java. Давайте посмотрим на небольшую программу Java для визуализации рабочей теоремы вызова ссылочного метода. ( Я намеренно использую Java здесь, чтобы мы могли сравнить и контрастировать различия, когда мы обсудим Позвоните по ссылочному методу объекта Использование Python через некоторое время .)
public class Reference{ int data=10; public static void main(String args[]){ Reference obj=new Reference(); System.out.println("before change "+obj.data); obj.change(obj);//passing object System.out.println("after change "+obj.data); } void change(Reference obj){ obj.data=obj.data+100;//changes will be in the instance variable } }
Выход:
before change 10 after change 110
Чтобы понять разницу с помощью ссылки и вызовите методы значений, посмотрите на анимацию, приведенную ниже:
Основы звонка по ссылке объекта
Многие из вас могут столкнуться с ссылкой и позвонить по значению методов вызывающей функции Но если вы новичок в мире Python, то, вероятно, термин Позвоните по ссылке объекта это новое для вас. Вот напоминание для вас, прежде чем мы обсудим, как функция звонков работает в Python – Все является объектом в Python.
Python ни использует звонок по значению, ни звоните посредством ссылки. Он использует Call-Object-Reference/Call-назначение, что означает: –
- Когда Музейный объект Как и список передается в функцию, он выполняет ссылку Call-Reference.
- Когда неизменный объект Как и номер, строка или кортеж, передается на функцию, она выполняет Call-значение.
Пример: Следующая программа демонстрирует вышеуказанную концепцию, где Python выполняет ссылку Call-Rection в случае сочеловеческих объектов, таких как списки, когда Call-value в случае неизменного объекта, как строка: –
def refer(l): l.append(5) print("list inside function : ",l) return l def value(n): name = "Python" print("Name within function : ",name) return name li = [1,2,3,4] print("list before function return : ",li) refer(li) print("list after function return : ",li) name = "Finxter" print("Name before function return : ",name) value(name) print("Name after function return : ",name)
Выход:
list before function return : [1, 2, 3, 4] list inside function : [1, 2, 3, 4, 5] list after function return : [1, 2, 3, 4, 5] Name before function return : Finxter Name within function : Python Name after function return : Finxter
Теперь, когда приносит нас в критический вопрос:
Как пройти неизменной переменную посредством ссылки в Python?
Это не будет проблемой в случае смежных объектов, но в случае неизменных объектов мы должны вытащить несколько трюков из нашего кармана, чтобы изменить их. Давайте посмотрим на некоторые из них на следующем этапе нашей статьи.
Метод 1: вернуть новое значение и перенаправить
Простой обходной путь для передачи неизменной переменной, такой как строка посредством ссылки – это принять переменную, сделать модификацию на нее и вернуть значение. После возврата переменной переназнайте возвращенное значение из функции в переменной снова, поскольку она находится за пределами локальной области функции.
Это может быть немного запутанным, но в следующем коде сделано сделает все возможное для вас:
def change(n): n = "Sayon" return n name = "Shubham" print("Name before function call is ", name) name = change(name) print("Name after function call is ", name)
Выход:
Name before function call is Shubham Name after function call is Sayon
Способ 2: Передача неизменных значений с использованием словарей или списков
Теперь этот метод немного взломать с проходом посредством ссылки неизменных объектов. Поскольку словари Python являются объектами отображения типа отображения и являются смежными, вы можете определить свои неизменные переменные внутри словаря, а затем пропустить их к функции. Несмотря на то, что списки не используются для сопоставления объектов, однако вы все еще можете использовать их, такие как словари, потому что элементы списка могут быть доступны, используя их индекс, и списки измеряются.
Давайте посмотрим, как мы определяем строку и номер и передаем их как ссылку, используя список и словарь:
name = {'name': 'Christian'} n = [4] print("***Values Before Function Call***") print("Name: ",name['name']) print("Number: ",n[0]) def func(d): d['name'] = 'Mayer' def foo(n): n[0] += 1 func(name) foo(n) print ("***Values After Function Call***") print("Name: ",name['name']) print("Number: ",n[0])
Выход:
***Values Before Function Call*** Name: Christian Number: 4 ***Values After Function Call*** Name: Mayer Number: 5
Метод 3: использование класса и ключевого слова
Ключевое слово . Я
используется для доступа к атрибутам экземпляра. Мы можем установить атрибуты внутри __init__
а затем изменить их значение в методах экземпляра.
Давайте посмотрим на следующую программу, чтобы понять, как это работает для нас:
class Changed: def __init__(self): self.var = 10 print("Value before function call :",self.var) self.Change(self.var) print("Value after function call :",self.var) def Change(self,n): self.var = n+1 obj = Changed()
Выход:
Value before function call : 10 Value after function call : 11
Заключение
Ниже приведены ключевые вынос из этой статьи: –
- Основы вызова по стоимости.
- Основы звонка посредством ссылки.
- Основы звонка по ссылке на объект в Python для смежных и неизменных объектов.
- Методы пропустить неизменных объектов посредством ссылки в Python.
Я надеюсь, что вы нашли эту статью полезную. Пожалуйста, подпишитесь и оставайтесь настроенными для более интересных статей в будущем!
Я профессиональный Python Blogger и Content Creator. Я опубликовал многочисленные статьи и создал курсы в течение определенного периода времени. В настоящее время я работаю полный рабочий день, и у меня есть опыт в областях, таких как Python, AWS, DevOps и Networking.
Вы можете связаться со мной @:
Оригинал: “https://blog.finxter.com/how-to-pass-a-variable-by-reference-in-python/”