Указатели в 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.
Почему у 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.
Неизменные и изменчивые объекты
В Python есть два типа объектов:
- Immutable objects изменить нельзя.
- Mutable objects можно изменить.
Понимание этой разницы является первым ключом к навигации по указателям в Python. Вот разбивка общих типов и того, являются ли они изменяемыми или неизменяемыми: