unicode字符串中的内存位置

Zok*_*kis 5 python unicode python-2.7

我知道有人解释为什么当我在Python 2.7中创建相同的unicode字符串时,它们不会指向内存中的相同位置,因为在"普通"字符串中

>>> a1 = 'a'
>>> a2 = 'a'
>>> a1 is a2
True
Run Code Online (Sandbox Code Playgroud)

好吧那就是我的预期,但是

>>> ua1 = u'a'
>>> ua2 = u'a'
>>> ua1 is ua2
False
Run Code Online (Sandbox Code Playgroud)

为什么?怎么样?

aba*_*ert 2

普通字符串不保证被保留。有时是,有时不是。这些规则很复杂,特定于版本,并且故意没有记录。

您可以相信,只要有个好主意,Python 都会尝试实习小型的常用对象。而且,如果您编写任何依赖于其中一个a1 is a2或相反的代码,那么它就会在最不方便的时候崩溃。

如果您想要更多,您必须查看您感兴趣的任何版本的源代码。对于 CPython,详细信息主要在stringobject.c2.62.7以及3.3unicodeobject.c内部。

后一个文件当然也存在于 2.x 中(它仍然定义类型unicode,只是与 3.x 中的类型不同str)。您可以从2.7源代码中看到对实习字符串的一些支持unicode即使您无法调用intern它们。乍一看,2.7 似乎可以处理内部unicode字符串,但永远不会创建它们。

同时,3.3 使事情变得更加有趣,因为对象str可以指向 UTF-8、UTF-16 或 UTF-32 存储,这些存储可能会被保留,但使用旧式 Unicode API 的代码可能仍然会以新副本。因此,即使a1 is a2您尝试获取他们的字符,他们也可能有不同的缓冲区。

python何时选择intern一个字符串对细节有更多的了解。但同样,来源才是最重要的。