Avatar ·

Что такое объект в Python. Почему id(a) == id(b) == id(1)?

📁 python, пример, ии, книга, работа

"

Детализирую вопрос.
В книгах по Python пишут, что все в Python есть объект.

Берем традиционный подход к изучению/обучению языкам программирования. Языки Pascal, C, C++, у них есть понятие ""имя переменной"" (идентификатор). С именем переменной связывается/присваивается значение. Значение хранится в памяти. Имя переменной - это способ (в исходном тексте программы) обратиться к ячейке памяти для получения значения, которое там хранится.

Не знаю верно ли высказывание (для компилируемых языков): Для переменных, например, целого типа, в момент выполнения программы на компьютере, процессор работает уже с адресами ячеек памяти, где хранятся значения переменных. Т.е. не такого, что где-то по какому-то адресу хранится имя переменной и оно связывается с адресом ячейки, в которой хранится значение.

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

a = 1print(a)a = ""Hello""print(a)

Но тогда как понять действие функции id()? По определению стандарта она возвращает ""identify"" указанного объекта. Причем, ""возвращает целое, гарантированно являющееся уникальным"" и постоянным для объекта на время его существования.""

Тогда почему

a = 1b = 1print(id(a) == id(b) == id(1))  # Trueprint(""Why?"")

ведь a, b, 1 разные объекты?
По-моему вопрос получился...

Используется Python 3.6


Про значения от -5 до 256 наслышан. Имеет место быть

a = 1000000b = 1000000print(id(a) == id(b))  # Trueprint(""Why?"")

На счет того, что достаточно ""знать об именах и т.д."". Для меня не достаточно, потому и спрашиваю у уважаемых профи. В Питоне все объект. Нет имен переменных. Отсюда и мой вопрос.

"

Avatar ·

"

В разное время с одним и тем же объектом может соотноситься разный другой объект.

Вы хотели сказать: в разное время, одно и то же имя может ссылаться на разные объекты

Модель в Питоне простая — совершенно не нужно знать что такое адрес, ячейка памяти, указатель. Достаточно знать только об именах и объектах, к которым они привязаны.

Вот Ярлыки и шарики достаточны, чтобы любое поведение на уровне Питона объяснить — сперва не верится что такая простая модель все крайние случаи охватывает.

ведь a, b, 1 разные объекты?

У вас только один объект (единица). Маленькие целые кэшируются в CPython. Разные имена a, b ссылаются на один и тот же объект: a is b (id(a) == id(b)). 1 это константа в исходном коде (думайте как о вызове конструктора для объекта). Подробнее об int объектах: .

a = 1000000; b = 1000000; print (id(a) == id(b)) # True

Для проверки ссылаются ли имена на одни и те же объекты, используйте a is b (здесь это равнозначно id(a) == id(b), но id может быть переопределён в общем случае).

Результат может быть True (зависит как Питон код был в байт-код скомпилирован в выбранной реализации), но не обязан быть True:

>>> a = 1000000>>> b = 1000000>>> print (a is b) False

В данном случае, каждое выражение отдельно компилируется, a и b на разные объекты ссылаются. Сравните:

>>> def f():...     a = 1000000...     b = 1000000...     print(a is b)>>> f()True

Код функции как одно целое компилируется, поэтому a is b может (но не обязано) быть True. Один это объект или несколько может зависеть от реализации Питона (CPython, Pypy, Jython, etc) и даже конкретной версии реализации. Реальный код не должен зависеть от подобных деталей реализации. : не используйте проверку на идентичность для сравнения чисел (разные объекты могут иметь одно значение). Используйте a == b, чтобы узнать равны ли числа.

Питоне все объект. Нет имен переменных. Отсюда и мой вопрос.

Конечно в Питоне есть имена. a и b это имена в вашем вопросе.

То что кодом Питона в разных представлениях можно манипулировать как простым объектом (в функцию передать как параметр, вернуть из функции, вызвать методы, итд) никак не отменяет наличие имён.

Примеры:

  • — имена это узлы типа _ast.Name. Более сложный пример это

  • исходного кода (lib2to3)

Также, для манипуляций Питон кода, может быть полезно знать о compile(), eval(), exec() встроенных функциях, dis, , inspect модулях. К примеру, В уже упомянутой ссылке показано как .

"

Войдите чтобы оставить ответ

Блоги