Так. Мне становится ясно, что ничего не ясно. )
Цитирую Саммерфилда:
“В языке Python нет переменных как таковых - вместо них используются ссылки на объекты. …интерпретатор создает объект, а затем создает ссылку на объект.
Поскольку все переменные в языке Python фактически являются ссылками, иногда возникает необходимость определить, не ссылаются ли две или более ссылок на один и тот же объект. Оператор is - это двухместный оператор, который возвращает True, если ссылка слева указывает на тот же самый объект, что и ссылка справа.
…сравниваются ссылки на объекты, а не сами объекты. Оператор is сравнивает только адреса памяти, в которых располагаются объекты - если адреса равны, следовательно, ссылки указывают на один и тот же объект.”
Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import sys
>>> #пример из книги
>>> a = "many paths"
>>> b = "many paths"
>>> id(a), id(b) #подсмотрено в посте №2
(56237168, 56237232)
>>> sys.getrefcount("many paths") #совет из поста №5
2
>>> a is b
False
>>> a == b
True
>>>
>>> #повторяю без пробела
>>> a = "manypaths"
>>> b = "manypaths"
>>> id(a), id(b)
(56236976, 56236976)
>>> sys.getrefcount("manypaths")
4
>>> a is b
True
>>> a == b
True
Интерпретатор в первом случае создал два объекта, а во втором один? Почему?
old_monty
Чтобы точно знать, сколько ссылок указывает на данный объект, можно применять функцию getrefcount() из модуля sys
Почему sys.getrefcount(“manypaths”) отдает 4?