我知道有人在我创作时解释原因 Python 2.7中相同的unicode字符串 它们没有指向内存中的相同位置 与“普通”字符串一样
>>> a1 = 'a'
>>> a2 = 'a'
>>> a1 is a2
True
好的,这就是我的预期,但是
>>> ua1 = u'a'
>>> ua2 = u'a'
>>> ua1 is ua2
False
为什么呢?如何?
答案 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.c
内2.6和2.7,unicodeobject.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对细节有了更深入的了解。但同样,消息来源才是最重要的。