Aar*_*all 8 python singleton types immutability
Python是不可变的单身人士吗?
如果你查看内置类型的CPython实现,你会发现它们的空版本是单例的所有不可变内置对象的注释.这将非常有意义,因为Python可以避免在永远不会改变的冗余项目上浪费内存.
具体来说,这是引用frozensets的2.6的来源.它声明为评论:
/* The empty frozenset is a singleton */
Run Code Online (Sandbox Code Playgroud)
我在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
Run Code Online (Sandbox Code Playgroud)
这是否意味着评论错误?这是2.6.5中的错误吗?这是在后续版本的Python中保证的吗?如果是这样,我在文档中找不到对它的引用.
我问这个是因为我需要一张与会员资格相同的支票(None, ''),但原因是另一个故事.
这就是为什么is用于检查None和使用==Python的空类型语义错误以控制与其他类型相关的流程的最佳实践?
总结一下:
Python的空不可变性是否一直保证是单身人士?
Rob*_*obᵩ 10
的标准类型的描述不作任何承诺,等效的对象是相同的,除了True,False,None,NotImplemented,和Ellipsis.它没有做出的一些承诺是() is (),也不1 is 1是'hello' is 'hello'.(事实上,文件明确否认了1 is 13.1的最后一段中的要求.)
不,Python的空不可变容器不能保证是单例*.唯一可以保证单身是True,False,None,NotImplemented,和Ellipsis.