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

时间:2014-08-12 20:07:44

标签: python types singleton immutability

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的空不可变性是否一直保证是单身人士?

1 个答案:

答案 0 :(得分:10)

TrueFalseNoneNotImplementedEllipsis外,description of standard types不承诺等效对象相同。 所做的一些承诺是() is ()1 is 1'hello' is 'hello'。 (事实上​​,文档具体在3.1的最后一段中否认要求1 is 1。)

不,Python的空不可变容器不能保证是单例 * 。唯一有保证的单身人士是TrueFalseNoneNotImplementedEllipsis


<小时/> * 注:单词&#34; singleton &#34;在此上下文中使用的除了其普遍接受的含义之外。在这篇文章中,单例表示只能由一个对象保存的值;因此,包含该值的每个对象都是相同的。