为什么等效字符串的ID之间存在奇怪的行为?

时间:2015-07-23 18:15:09

标签: python python-2.7

根据我的理解,如果为不可变类型的变量赋值等于同一不可变类型的另一个变量,则它们都应该引用同一个对象。我使用的是Python 2.7.6,不知道这是不是一个bug。

这就像我理解的那样:

.toThrow()

但是,通过改变一个字符,这不起作用:

x = 'ab'
y = 'ab'
id(x) == id(y)
True

奇怪的是,并行分配是非常不同的!

x = 'a#'
y = 'a#'
id(x) == id(y)
False

我不明白这种行为。

1 个答案:

答案 0 :(得分:5)

您所谈论的内容称为string interning。这是一种内部机制,并不能保证两个不同的字符串将存储在内存中的相同位置。这不是一个bug,所以不要依赖这种行为。这与C / C ++中的未定义行为属于相同的一般类别。

You may be interested in this answer

虽然我能够在REPL中复制这种行为,但如果我将代码放在一个文件中然后用解释器运行它,那么对我总是会返回true。

顺便提一下,有一种方法可以保证对象是相同的:

>>> x = intern('a#')
>>> y = intern('a#')
>>> x is y
True

More details on the subject can be found in this blog post