Добавить в корзинуПозвонить
Найти в Дзене

Почему у id(print) и id(print()) – разные адреса?

*** id(print) # 1738991274000 id(print()) # 140705445104448 Что мы видим? Нечто странное: функция – print() – одна, а адреса – разные! Почему? Разные адреса, которые мы видим при вызове id(print) и id(print()), обусловлены фундаментальным различием между объектом и результатом его вызова. В языке Python всё является объектом: числа, строки, функции, классы. У каждого объекта есть уникальный идентификатор, который возвращает функция id(). *** 1. id(print) • Если мы введём в интерактивном интерпретаторе Python просто print, то он ответит, что это встроенная функция – <built-in function print> • Тип print относится к классу «встроенная функция или метод» – <class 'builtin_function_or_method'> • Вводя id(print), мы передаём в функцию id() сам объект-функцию print. • В Python функция – это объект первого класса. Когда мы пишем просто print, мы ссылаемся на этот объект. • Функция id() возвращает уникальный идентификатор (адрес в памяти) именно этого объекта-функции. • Классическ
Оглавление

***

Введём в интерактивном интерпретаторе Python следующий код:

id(print) # 1738991274000

id(print()) # 140705445104448

Что мы видим?

Нечто странное: функция – print() – одна, а адреса – разные!

Почему?

Разные адреса, которые мы видим при вызове id(print) и id(print()), обусловлены фундаментальным различием между объектом и результатом его вызова.

В языке Python всё является объектом: числа, строки, функции, классы.

У каждого объекта есть уникальный идентификатор, который возвращает функция id().

***

Объяснение

1. id(print)

Если мы введём в интерактивном интерпретаторе Python просто print, то он ответит, что это встроенная функция – <built-in function print>

-2

Тип print относится к классу «встроенная функция или метод» – <class 'builtin_function_or_method'>

-3

Вводя id(print), мы передаём в функцию id() сам объект-функцию print.

В Python функция – это объект первого класса. Когда мы пишем просто print, мы ссылаемся на этот объект.

Функция id() возвращает уникальный идентификатор (адрес в памяти) именно этого объекта-функции.

Классическая аналогия: представим, что print – это молоток. id(print) – это серийный номер молотка (клеймо, выбитое на самом молотке).

***

2. id(print())

Здесь происходит следующее:

Сначала выполняется вызов функции: print(). По умолчанию, если вызвать print() без аргументов, она выведет символ новой строки (\n) в консоль (то есть пустую строку).

-4

Результатом этого вызова является объект None (в Python любая функция, которая не возвращает значение явно, по умолчанию возвращает None).

-5

Затем функция id() получает на вход этот результат, то есть объект None.

Таким образом, id(print()) вычисляет идентификатор не функции print, а объекта None, который является результатом её (функции) вызова.

Классическая аналогия: мы берём молоток (print) и используем его по назначению (забиваем гвоздь). Результатом этого действия является или "сделанная работа", или "отсутствие результата" (None). id(print()) – это
как если бы мы попытались найти серийный номер у этой "сделанной работы", а не у самого молотка.

***

Итог

• id(print) возвращает адрес в памяти объекта-функции print.

• id(print()) возвращает адрес в памяти объекта None (так как print() вызывается и возвращает None).

Это разные объекты, поэтому они имеют разные идентификаторы.

***

Пример для наглядности

Мы можем проверить это с помощью оператора сравнения is, который проверяет идентичность объектов (то есть, являются ли они одним и тем же объектом в памяти).

# Создадим переменную для наглядности

result_of_print = print() # Вызовет print и сохранит результат (None) в переменную

# Сравним результат вызова print с объектом None

print(result_of_print is None) # Выведет: True

# Теперь посмотрим на их id

print(f"id(print) = {id(print)}")

print(f"id(None) = {id(None)}")

print(f"id(result_of_print) = {id(result_of_print)}")

-6

Вывод будет выглядеть примерно так:

True

id(print) = 1738991274000 # Какой-то адрес

id(None) = 140705445104448 # Другой адрес

id(result_of_print) = 140705445104448 # Совпадает с id(None)

Как видим, идентификатор объекта None (и результат вызова print()) всегда один и тот же в рамках одной сессии Python, – но он кардинально отличается от идентификатора самой функции print.