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

Way*_*ner 2 python string identity

我读到了某个地方(我想,也可能是其他地方的SO帖子),Python自动引用单个字符串,所以不仅如此'a' == 'a',而且'a' is 'a'.

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

官方来源的奖励积分.

Chr*_* B. 14

它是特定于实现的.这很难说,因为(如参考文献所述):

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

解释器非常适合确保它们是相同的,但它并不总是有效:

x = u'a'
y = u'abc'[:1]
print x == y, x is y
Run Code Online (Sandbox Code Playgroud)

在CPython 2.6上运行,这给出了True False.

  • 我不确定,但我永远不会依赖它. (5认同)
  • 这个答案中给出的例子证明你*不能*依赖它.+1 (2认同)

Dun*_*can 6

它是所有实现定义的.

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

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

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

>>> a = '!'
>>> a is '!'
False
>>> a = 'a'
>>> a is 'a'
True
>>>
Run Code Online (Sandbox Code Playgroud)

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

>>> '!' is '!'
True
Run Code Online (Sandbox Code Playgroud)