Страницы

Поиск по вопросам

среда, 3 октября 2018 г.

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

Детализирую вопрос. В книгах по Python пишут, что все в Python есть объект.
Берем традиционный подход к изучению/обучению языкам программирования. Языки Pascal, C, C++, у них есть понятие "имя переменной" (идентификатор). С именем переменной связывается/присваивается значение. Значение хранится в памяти. Имя переменной - это способ (в исходном тексте программы) обратиться к ячейке памяти для получения значения, которое там хранится.
Не знаю верно ли высказывание (для компилируемых языков): Для переменных, например, целого типа, в момент выполнения программы на компьютере, процессор работает уже с адресами ячеек памяти, где хранятся значения переменных. Т.е. не такого, что где-то по какому-то адресу хранится имя переменной и оно связывается с адресом ячейки, в которой хранится значение.
Теперь переходим к Python. В этом языке все является объектом, даже определение функции. Переменная объект, значение объект и т.д. В разное время с одним и тем же объектом может соотноситься разный другой объект.
a = 1 print(a) a = "Hello" print(a)
Но тогда как понять действие функции id()? По определению стандарта она возвращает "identify" указанного объекта. Причем, "возвращает целое, гарантированно являющееся уникальным" и постоянным для объекта на время его существования."
Тогда почему
a = 1 b = 1 print(id(a) == id(b) == id(1)) # True print("Why?")
ведь a, b, 1 разные объекты? По-моему вопрос получился...
Используется Python 3.6

Про значения от -5 до 256 наслышан. Имеет место быть
a = 1000000 b = 1000000 print(id(a) == id(b)) # True print("Why?")
На счет того, что достаточно "знать об именах и т.д.". Для меня не достаточно, потому и спрашиваю у уважаемых профи. В Питоне все объект. Нет имен переменных. Отсюда и мой вопрос.


Ответ

В питоне интерпретатор оптимизирован так, что небольшие целые числа представлены одним объектом - это сделано в целях улучшения производительности. Для больших чисел это уже не выполняется.
Марк Лутц - Изучаем Python, 4-е издание, 2011, стр. 204:
>>> X = 42 >>> Y = 42 # Должно получиться два разных объекта >>> X == Y True
>>> X is Y # Тот же самый объект: кэширование в действии! True В этом примере переменные X и Y должны быть равны (==, одно и то же значение), но не эквивалентны (is, один и тот же объект), потому что было выполнено два разных литеральных выражения. Однако из-за того, что малые целые числа и строки кэшируются и используются повторно, оператор is сообщает, что переменные ссылаются на один и тот же объект.

Комментариев нет:

Отправить комментарий