Python空不可变单身?
如果你查看内置类型的CPython实现,你会发现它们的空版本是单例的所有不可变内置对象的注释。这很有道理,因为Python可以避免在永远不会改变的冗余项目上浪费内存。
Here, specifically, is the source for 2.6 that references frozensets.它声明为评论:
/* 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的空类型语义错误来控制与其他类型相关的控制流程的最佳做法?< / p>
总结一下:
Python的空不可变性是否一直保证是单身人士?
答案 0 :(得分:10)
除True
,False
,None
,NotImplemented
和Ellipsis
外,description of standard types不承诺等效对象相同。 不所做的一些承诺是() is ()
,1 is 1
和'hello' is 'hello'
。 (事实上,文档具体在3.1的最后一段中否认要求1 is 1
。)
不,Python的空不可变容器不能保证是单例 * 。唯一有保证的单身人士是True
,False
,None
,NotImplemented
和Ellipsis
。