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

在Python中,单个字符串是否保证相同?,python,string,identity,Python,String,Identity,我在某个地方读到过(我认为是一篇很好的帖子,可能也在其他地方读过),Python自动引用单个字符串,所以不仅'a'='a',而且'a'是'a' 然而,我不记得读过什么,这是Python中保证的行为,还是只是特定于实现的行为 官方来源的奖励积分。具体实施。这很难说,因为(正如作者所说): 。。。对于不可变类型,计算新值的操作实际上可能返回对具有相同类型和值的任何现有对象的引用,而对于可变对象,这是不允许的 口译员在确保它们完全相同方面做得很好,但并不总是有效: x = u'a' y = u'abc

我在某个地方读到过(我认为是一篇很好的帖子,可能也在其他地方读过),Python自动引用单个字符串,所以不仅
'a'='a'
,而且
'a'是'a'

然而,我不记得读过什么,这是Python中保证的行为,还是只是特定于实现的行为


官方来源的奖励积分。

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

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

口译员在确保它们完全相同方面做得很好,但并不总是有效:

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

在CPython 2.6上运行,这将给出
真假

所有这些都是实现定义的

intern的文档中说:“通常情况下,Python程序中使用的名称是自动插入的,用于保存模块、类或实例属性的字典具有插入键。”

这意味着,任何可能是名称并且在编译时已知的内容都可能(但不能保证)与相同名称的任何其他事件相同

其他字符串未声明要被拘留。出现在同一编译单元中的常量字符串被折叠在一起(但这也只是一个实现细节),因此您可以得到:

>>> a = '!'
>>> a is '!'
False
>>> a = 'a'
>>> a is 'a'
True
>>>
包含标识符的字符串是插入的,因此即使在不同的编译中也会得到相同的字符串。非标识符的字符串仅在同一编译单元中共享:

>>> '!' is '!'
True

我不确定,但我永远不会依赖它。这就是为什么我要寻找一个官方(或至少是非常有声望的)来源:p这个答案中给出的例子证明你不能依赖它+1Interest—对于unicode,它给出False,但对于常规字符串,它给出False(至少在我的交互式解释器中是这样)。但我觉得这一解释令人满意。CPython实现长期以来一直专门使用单字符字符串,因为它相对便宜且易于操作(因为只有256个)。对于unicode字符串,有1114111个不同的单字符字符串,你看:那你到底为什么要知道这一点呢?主要是好奇心。并且希望能够明确地告诉其他人(尤其是初学者)它被提到的地方。你不明白将字符串(或int)与
进行比较是不可取的行为。当它使实现更高效时,这是一个可以接受的小故障。我想它应该被期望的原因是,如果字符串是不可变的,那么就没有理由存储字符串的多个副本。我确信这在简化方面是一个严重的错误,但至少对我来说是有意义的;)