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)
为什么?怎么样?
普通字符串不保证被保留。有时是,有时不是。这些规则很复杂,特定于版本,并且故意没有记录。
您可以相信,只要有个好主意,Python 都会尝试实习小型的常用对象。而且,如果您编写任何依赖于其中一个a1 is a2或相反的代码,那么它就会在最不方便的时候崩溃。
如果您想要更多,您必须查看您感兴趣的任何版本的源代码。对于 CPython,详细信息主要在stringobject.c2.6和2.7以及3.3的unicodeobject.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一个字符串对细节有更多的了解。但同样,来源才是最重要的。