Изучаете Python? Привыкайте часто это слышать
В начале было два объекта. Легенды говорят нам, что от этих двух родились все остальные объекты творения. Они были благословенными объектами, поскольку они унаследовали от другого, а все другие объекты унаследовали от них. - Питонские стихи
Хорошо, нет такого текста, как Pythonic Verses. Но если послушать, то создание и использование Python похоже на нечто из великой эпопеи. Вещи таковы по причинам, и они прекрасны.
Я относительно новичок в Python, и каждый день приносит мне какие-то открытия, и это действительно блестяще. Я поделюсь сегодняшним уловом в этой записи.
Id
Попробуйте это в интерпретаторе Python (введите python3
в свой терминал):
Давайте посмотрим на первый пример, 42. Верно, верно. Тот же идентификатор. Что функция id()
делает для нас?
Функция id()
возвращает «идентификатор» объекта в виде целого числа, гарантированно уникального и постоянного для объекта (в течение его жизни два объекта с непересекающимися временами жизни могут иметь одинаковый идентификатор).
Каждый уникальный объект в Python имеет свой идентификатор. Это не связано с содержимым — это связано с местом, где хранится информация, описывающая объект. Любой уникальный объект, хранящийся в уникальном месте, будет иметь свой идентификатор. У вас может возникнуть соблазн подумать, что идентификатор соответствует адресу расположения объекта в памяти, но это зависит как от реализации Python, так и от платформы.
Почему a и b в первом примере имеют одинаковый идентификатор? Поскольку это целые числа, они имеют одинаковое значение и являются неизменяемыми. Если вы измените значение, к которому привязан a, он получит новый идентификатор и, по сути, станет новым объектом.
Во втором примере я использую объект типа mutable, список. Они могут и должны изменяться в течение своего времени существования. Таким образом, хотя содержимое a и b одинаково (a == b, True
), у них разные идентификаторы.
Скоро я вернусь к изменяемым и неизменяемым объектам.
Тип
Мы не можем говорить об объектах (все в Python, помните) без упоминания type().
Эта функция возвращает тип переданного ей объекта.
type()
может быть полезно для отсеивания плохих аргументов, передаваемых вашим функциям, хотя лично мне нравится isinstance()
, по крайней мере, на момент написания этой статьи. В этой статье наиболее важным аспектом типов объектов является то, что они могут быть изменяемыми или неизменяемыми.
Изменяемые объекты
Объекты встроенных типов, таких как (list, set, dict), являются изменяемыми.
Изменяемые объекты — объекты, которые можно изменить, например списки, — будут начинаться с разных идентификаторов, даже если они идентичны, в ожидании изменений. Если объект является изменяемым, вы можете создать два разных объекта (с уникальными идентификаторами) с одинаковым содержимым. Если вы измените один позже, второй не изменится.
Неизменяемый объект
Объекты встроенных типов, таких как (int, float, bool, str, tuple, unicode), неизменяемы. Поэтому, хотя a и b в приведенном ниже примере начинаются с одного и того же идентификатора, когда мы меняем один, даже если мы указали b в a, после этого у них есть уникальные идентификаторы. Изменение a создает новый объект, потому что содержимое a не может быть изменено без этого.
Содержимое неизменяемых объектов, таких как целые числа и строки, никогда не может измениться. Кроме того, даже если два неизменяемых объекта имеют разные идентификаторы, они по существу равны, если у них идентичное содержимое, как мы видим, сравнивая два идентичных экземпляра строки, т.е. a == b .
Какая разница?
Изменяемые типы могут быть изменены на месте. Неизменяемые типы не могут меняться на месте. Именно так Python видит мир. — кто-то, stackoverflow
Видите, что я имею в виду под «эпическим» качеством распространения знаний о Python?
Если и изменяемые, и неизменяемые типы объектов могут более или менее изменяться, в чем разница?
- Это может иметь значение в том, как вы извлекаете изменения при передаче этих типов функциям.
- Важно знать, что вы делаете с данными, когда воздействуете на них с помощью обычных функций или операций, таких как
list.copy()
или+=.
. - Изменение неизменяемых объектов «дорого» в том смысле, что при этом создается новый объект. Это не так с изменяемыми объектами.
- Приходя из C, мне полезно «стряхнуть» свои C-измы при написании на Python. (Все по-другому! «Переменные» — это имена, а «назначение» — это привязка имени к объекту.Это продолжается и продолжается.)
Что это означает для нашей функции (args)?
Все это может показаться академическим, но это будет иметь значение для вас, когда вы будете писать на Python.
Когда изменяемый объект вызывается по ссылке* в функции, он может изменить саму переменную. Если вы не хотите, чтобы это произошло, сначала необходимо скопировать изменяемую переменную. Неизменяемые объекты не пострадают таким образом, как мы узнали выше. В любом случае вы не должны предполагать, что у объектов одинаковые идентификаторы, вам нужно знать.
*Python использует систему, известную как Вызов по ссылке на объект или Вызов по назначению. В случае передачи в функцию таких аргументов, как целые числа, строки или кортежи, передача аналогична вызову по значению, поскольку вы не можете изменить значение неизменяемых объектов, передаваемых в функцию. А передачу изменяемых объектов можно рассматривать как вызов по ссылке, потому что когда их значения изменяются внутри функции, то это также будет отражаться вне функции. — гиксфоргики
Бонусный улов: дополнительный кредит
В проектах Холбертон нам часто предоставляется возможность выйти за рамки ежедневного материала и получить дополнительные баллы в процессе. Сегодняшний день не стал исключением. Сегодня я получил:
- Заглянем внутрь реализации Python3 на CPython.
- Первый взгляд на блокировку the
__slots__
в классе - Возможность вмешиваться с
getattr()
иsetattr()
в мои функции для крутого эффекта.
Если я углублюсь в любой из них, я мог бы написать об этом здесь.
Дзен Python
Я оставлю вам еще одну вещь, к которой вам нужно привыкнуть, если вы новичок в Python: import this.
Спасибо за чтение!
Источники:
Простым языком
Проявите любовь, подписавшись на наш канал YouTube!