Найти - Пользователи
Полная версия: оператор IS, сравнение данных
Начало » Python для новичков » оператор IS, сравнение данных
1 2
old_monty
mimo
Интерпретатор в первом случае создал два объекта, а во втором один? Почему?
В первом случае строка “many paths” достаточно длинная и не кэшируется, т.е. создаются два объекта. Во втором случае короткая строка “manypaths” кэшируется, и создается один объект. Поскольку строки являются неизменяемыми объектами, несколько ссылок могут безопасно ссылаться на этот один объект, что и подтверждает проверка a is b == True.

mimo
Почему sys.getrefcount(“manypaths”) отдает 4?
Думаю, это потому, что в результат, возвращаемый при вызове функции sys.getrefcount(“manypaths”), входят также временно созданные ссылки на аргумент самой функции. То есть, были созданы дополнительные ссылки на строку “manypaths”, когда она была передана в функцию sys.getrefcount().
old_monty
Вот еще на эту тему:
>>> a = 'hello'
>>> b = 'hello'
>>> sys.getrefcount("hello")
4
А вот что получается (по крайней мере у меня) со случайными строками, если их создавать “на лету” и сразу же передавать в функцию sys.getrefcount(), вообще без присваивания каким-либо ссылкам:
>>> sys.getrefcount("spam")
3
>>> sys.getrefcount("tango")
3
>>> sys.getrefcount("everything")
3
>>> sys.getrefcount("sunshine")
3
>>> sys.getrefcount("Time is money")
3
terabayt
ну все это зависит от версии пайтона
вот 2.7
>>> sys.getrefcount("spam")
2

а так, уж если хотите сильно углубится то смотрите код пайтона
вот может чем-то поможет
stringobject
py.user.next
>>> import sys
>>> 
>>> sys.getrefcount('a')
12
>>> sys.getrefcount('b')
12
>>> sys.getrefcount('c')
24
>>> sys.getrefcount('d')
18
>>> sys.getrefcount('abcabc')
3
>>>

mimo
Интерпретатор в первом случае создал два объекта, а во втором один? Почему?
Это зависит от внутреннего состояния.

mimo
Почему sys.getrefcount(“manypaths”) отдает 4?
Это зависит от внутреннего состояния.

Всё, что нужно знать при сравнении объектов, - это равны ли значения их id(). Если равны, оператор is вернёт True, иначе - False.
mimo
Всем спасибо еще раз.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB