在Python中,单个字符串是否保证相同?

时间:2010-07-22 20:28:44

标签: python string identity

我在某个地方读过(我认为,也可能是其他地方的SO帖子),Python自动引用单个字符串,因此'a' == 'a''a' is 'a'不仅仅是{/ 1}}。

但是,我不记得读取这是否是Python中的保证行为,还是只是特定于实现?

官方消息来源。

2 个答案:

答案 0 :(得分:14)

具体实施。这很难说,因为(如reference所说):

  

...对于不可变类型,计算新值的操作实际上可以返回对具有相同类型和值的任何现有对象的引用,而对于可变对象,则不允许这样做。

口译员非常善于确保它们完全相同,但它并不总是有效:

x = u'a'
y = u'abc'[:1]
print x == y, x is y

在CPython 2.6上运行,这会产生True False

答案 1 :(得分:6)

这是所有实现的定义。

实习生的文档说:“通常,Python程序中使用的名称会自动实现,用于保存模块,类或实例属性的字典具有实习键。”

这意味着任何可能是名称且在编译时已知的内容很可能(但不能保证)与同名的任何其他实例相同。

其他字符串未声明为实习。出现在同一编译单元中的常量字符串被折叠在一起(但这也只是一个实现细节),所以你得到:

>>> a = '!'
>>> a is '!'
False
>>> a = 'a'
>>> a is 'a'
True
>>>

包含标识符的字符串被实现,因此即使在不同的编译中,您也会得到相同的字符串。不是标识符的字符串仅在同一编译单元中共享:

>>> '!' is '!'
True