Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 3, 2015 17:47:50

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

оператор IS, сравнение данных

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

mimo
Почему sys.getrefcount(“manypaths”) отдает 4?
Думаю, это потому, что в результат, возвращаемый при вызове функции sys.getrefcount(“manypaths”), входят также временно созданные ссылки на аргумент самой функции. То есть, были созданы дополнительные ссылки на строку “manypaths”, когда она была передана в функцию sys.getrefcount().

Отредактировано old_monty (Дек. 3, 2015 17:52:24)

Офлайн

#2 Дек. 3, 2015 18:06:30

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

оператор IS, сравнение данных

Вот еще на эту тему:

>>> 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

Офлайн

#3 Дек. 3, 2015 18:40:47

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

оператор IS, сравнение данных

ну все это зависит от версии пайтона
вот 2.7

>>> sys.getrefcount("spam")
2

а так, уж если хотите сильно углубится то смотрите код пайтона
вот может чем-то поможет
stringobject



————————————————
-*- Simple is better than complex -*-

Офлайн

#4 Дек. 3, 2015 23:29:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

оператор IS, сравнение данных

>>> 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.



Отредактировано py.user.next (Дек. 5, 2015 02:30:31)

Офлайн

#5 Дек. 4, 2015 15:30:09

mimo
Зарегистрирован: 2015-11-29
Сообщения: 4
Репутация: +  0  -
Профиль  

оператор IS, сравнение данных

Всем спасибо еще раз.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version