Python Empty Immutables Singletons ли са?
Ако прегледате реализацията на CPython на вградените типове, ще намерите коментари за всички неизменни вградени обекти, че техните празни версии са единични. Това би имало много смисъл, тъй като Python може да избегне загубата на памет за излишни елементи, които никога няма да се променят на място.
Тук е по-конкретно източникът за 2.6, който препраща към замръзнали набори. Той декларира като коментар:
/* The empty frozenset is a singleton */
Намирам същия коментар и в CPython 2.5. Мисля, че има смисъл да се препраща към източника в допълнение към документацията, защото CPython е референтната реализация на Python.
Използвам Python 2.6.5 и получавам следния резултат в моя интерпретатор:
>>> g = frozenset()
>>> f = frozenset('a') - frozenset('a')
>>> f
frozenset([])
>>> f is g
False
>>> id(f)
279262312
>>> id(g)
114734544
Това означава ли, че коментарът е грешен? Това бъг ли е във 2.6.5? Това гарантирано ли е в по-късните версии на Python? Ако е така, не мога да намеря препратка към него в документацията.
Питам това, защото имам нужда от проверка, която е идентична с членство в (None, '')
, но причината е друга история.
Ето защо се счита за най-добра практика да се използва is
за проверка за None
и да се използва ==
или семантичната фалшивост на Python на празни типове за контролен поток, свързан с други типове?
Да обобщим:
Гарантирано ли е някога, че празните неизменни елементи на Python ще бъдат единични?
frozenset()
е сингълтон, докатоfrozenset(iterable)
винаги е нов обект, дори когатоiterable
се окаже празен. Освен това фактът, че това е коментар в изходния код на едно изпълнение, а не забележка в документацията, добавя: Няма гаранция и няма смисъл да се притеснявате за това. - person   schedule 13.08.2014frozenset
всъщност използва методите за богато сравнение наset
, както и използваset_difference_multi
за метода на разликата, които всички създават нови екземпляри на набор за резултата, без значение какви входове получават. Тъй като OP задейства__sub__
под завивките, празната сингълтон оптимизация вfrozenset_new
е напълно без значение. - person Silas Ray   schedule 13.08.2014frozenset_new
, но не е глобално приложим. - person Silas Ray   schedule 13.08.2014