unicode字符串中的内存位置

时间:2013-03-13 18:48:18

标签: python unicode python-2.7

我知道有人在我创作时解释原因 Python 2.7中相同的unicode字符串 它们没有指向内存中的相同位置 与“普通”字符串一样

>>> a1 = 'a'
>>> a2 = 'a'
>>> a1 is a2
True

好的,这就是我的预期,但是

>>> ua1 = u'a'
>>> ua2 = u'a'
>>> ua1 is ua2
False

为什么呢?如何?

2 个答案:

答案 0 :(得分:3)

我认为常规字符串是实习的,但unicode字符串不是。这个简单的测试似乎支持我的理论(Python 2.6.6):

>>> intern("string")
'string'
>>> intern(u"unicode string")

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    intern(u"unicode string")
TypeError: intern() argument 1 must be string, not unicode

答案 1 :(得分:2)

无法保证正常字符串被中断。有时他们是,有时他们不是。规则很复杂,特定于版本,故意没有记录。

你可以依赖这样一个事实,即只要一个好主意,Python就会尝试实现常用的小对象。而且,如果您编写任何依赖于a1 is a2或相反的代码,那么只要它最不方便就会中断。

如果你想要的不止这些,你必须查看你感兴趣的任何一个实现版本的源代码。对于CPython,详细信息大多在stringobject.c2.62.7unicodeobject.c 3.3

后一个文件当然也存在于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,如果你试图找到他们的角色,他们可能会有不同的缓冲区。

When does python choose to intern a string对细节有了更深入的了解。但同样,消息来源才是最重要的。