Python是不可变的单身人士吗?

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.



*注意:在此上下文中使用" 单身 " 一词不是以其普遍接受的含义使用.在这篇文章中,单例表示只能由一个对象保存的值; 因此,包含该值的每个对象都是相同的.