Python передача объекта объекту

Указатели в Python: в чем смысл?

Если вы когда-либо работали с языками более низкого уровня, такими как C или C ++, то вы, вероятно, слышали об указателях. Указатели позволяют создавать большую часть кода. Они также приводят в замешательство новичков и могут привести к различным ошибкам в управлении памятью, даже для экспертов. Итак, где они в Python, и как вы можете имитировать указатели в Python?

Указатели широко используются в C и C ++. По сути, они являются переменными, которые содержат адрес памяти другой переменной. Чтобы освежить в памяти указатели, вы можете рассмотреть этотoverview on C Pointers.

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

В этой статье вы:

  • Узнайте, почему не существует указателей в Python
  • Исследуйте разницу между переменными C и именами Python
  • Имитация указателей в Python
  • Поэкспериментируйте с реальными указателями, используя ctypes

Note: В этой статье «Python» будет относиться к эталонной реализации Python на C, также известной как CPython. Поскольку в статье обсуждаются некоторые внутренние особенности языка, эти примечания верны для CPython 3.7, но могут не соответствовать действительности в будущих или прошлых итерациях языка.

Free Bonus:Click here to get access to a chapter from Python Tricks: The Book, который демонстрирует вам лучшие практики Python на простых примерах, которые вы можете мгновенно применить для написания более красивого кода Pythonic.

Читайте также:  Check div in html

Почему у Python нет указателей?

Правда в том, что я не знаю. Могут ли указатели в Python существовать изначально? Возможно, но указатели, похоже, противоречатZen of Python. Указатели поощряют неявные изменения, а не явные. Часто они сложны, а не просты, особенно для начинающих. Хуже того, они умоляют о способах выстрелить себе в ногу или сделать что-то действительно опасное, например прочитать из раздела памяти, который вы не должны были делать.

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

Понимание указателей в Python требует краткого обзора деталей реализации Python. В частности, вы должны понимать:

Держитесь за свои адреса памяти, и давайте начнем.

Объекты в Python

В Python все является объектом. Для доказательства вы можете открыть REPL и исследовать с помощью isinstance() :

>>> isinstance(1, object) True >>> isinstance(list(), object) True >>> isinstance(True, object) True >>> def foo(): . pass . >>> isinstance(foo, object) True

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

reference count предназначен для управления памятью. Для более подробного изучения внутреннего устройства управления памятью в Python вы можете прочитатьMemory Management in Python.

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

Хотя не все объекты одинаковы. Есть еще одно важное различие, которое вам нужно понять: неизменяемые и изменяемые объекты. Понимание различий между типами объектов действительно помогает прояснить первый слой лука, который является указателем в Python.

Читайте также:  table-layout

Неизменные и изменчивые объекты

В Python есть два типа объектов:

  1. Immutable objects изменить нельзя.
  2. Mutable objects можно изменить.

Понимание этой разницы является первым ключом к навигации по указателям в Python. Вот разбивка общих типов и того, являются ли они изменяемыми или неизменяемыми:

Источник

Как передать переменную по ссылке в Python?

Как передать переменную по ссылке в Python

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

Как же передать аргумент по ссылке? Вы можете добиться нужного эффекта несколькими способами.

Возвращение кортежа

def my_func(x, y): # x и y локальные имена, которым присвоены новые объекты x = 'новое значение' y = y + 1 # возвращаем новые значения return x, y a, b = 'старое значение', 9 a, b = my_func(a, b) print(a, b) результат: новое значение 10

Это почти всегда самое ясное решение.

Использование глобальных переменных

Использование глобальных переменных не рекомендуется, т. к. не потокобезопасно.

Передача изменяемого (mutable) объекта

def func1(a): # 'a' ссылается на изменяемый список a[0] = 'новое значение' a[1] = a[1] + 1 args = ['старое значение', 9] func1(args) print(args) результат: ['новое значение', 10]

Передача словаря

def func2(args): # args - изменяемый словарь args['a'] = 'новое значение' args['b'] = args['b'] + 1 args = func2(args) print(args) результат:

Передача экземпляра класса

class MyNamespace: def __init__(self, /, **args): for key, value in args.items(): setattr(self, key, value) def func3(args): args.a = 'новое значение' args.b = args.b + 1 args = Namespace(a='старое значение', b=9) func3(args) vars(args) результат:

Почти никогда не бывает веской причины, чтобы все так усложнять.

Лучший вариант из представленных – это вернуть кортеж, содержащий несколько возвращаемых значений.

Источник

Передавать по значению / ссылке и передавать по объектной ссылке в Python? — Подробное объяснение

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

Читайте также:  Javascript удалить все переносы строк

Итак, позвольте мне прояснить одну вещь в самом запуске. Модель передачи аргументов Python не является ни «передачей по значению», ни «передачей по ссылке», а «передачей по ссылке на объект».

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

Что такое передача по ссылке?

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

Результат: все операции, выполняемые с этой ссылкой, будут напрямую влиять на переменную, к которой она относится.

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

С другой стороны, когда вы передаете аргументы по значению, эти аргументы становятся независимыми копиями исходных значений.

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

Что такое передача объекта по ссылке?

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

Слишком сложно понять? Не стоит беспокоиться! Позвольте мне объяснить в терминах непрофессионала!

  1. В Python переменные не передаются по ссылке или по значению
  2. Вместо этого передается имя (также называемое ссылкой на объект), если базовый объект является изменяемым, тогда модификации объекта сохранятся.
  3. Если базовый объект неизменен, изменения в переменной не сохраняются.

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

Источник

Оцените статью