Являются ли Python пустыми неизменяемыми синглтонами?
Если вы просмотрите реализацию встроенных типов в 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