这是一个错误吗?

Is this a bug? Variables are identical references to the same string in this example (Python)

这是针对python 2.6的。

我不明白为什么A和B是相同的:

1
2
3
4
>>> a ="some_string"
>>> b ="some_string"
>>> a is b
True

但如果字符串中有空格,则它们不是:

1
2
3
4
>>> a ="some string"
>>> b ="some string"
>>> a is b
False

如果这是正常行为,有人能解释一下发生了什么吗?

编辑:免责声明!这不用于检查是否相等。我实际上想向别人解释"是"只是为了确认身份,而不是平等。从文档中我了解到以这种方式创建的引用是不同的,每次都会创建一个新的字符串。当我无法证明自己的观点时,我给出的第一个例子就让我失望了!

编辑:我知道这不是一个错误,实习对我来说是一个新概念。这似乎是一个很好的解释。


python可能会也可能不会自动执行intern字符串,这决定了字符串的未来实例是否共享引用。

如果它决定实习生一个字符串,那么两者都将引用同一个字符串实例。如果不这样做,它将创建两个恰好具有相同内容的独立字符串。

一般来说,你不必担心是否会发生这种情况;你通常想检查平等,a == b,而不是他们是否是同一个对象,a is b


蒂姆·彼得斯说:"对不起,我在这里看到的唯一错误就是你用"is"发布的代码试图确定两个字符串是否相等。"是"测试对象标识,而不是相等性,两个不变的对象是否真的是同一个对象,这通常不是由python定义的。您应该使用"=="检查两个字符串是否相等。使用"is"的唯一可靠时间就是显式地对所有要比较的字符串进行内部比较(通过使用intern()内置函数)。

从这里:http://mail.python.org/pipermail/python-bugs-list/2004-december/026772.html


实际上,这应该更像是对格雷恩答案的评论,但我现在还不能做评论。我已经在Python解释器上直接运行了一些测试,并且看到了一些有趣的行为。根据Glenn的说法,解释器将条目视为单独的"文件",在存储供将来参考时,它们不共享字符串表。以下是我的跑步记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
>>> a="some_string"
>>> b="some_string"
>>> id(a)
2146597048
>>> id(b)
2146597048
>>> a="some string"
>>> b="some string"
>>> id(a)
2146597128
>>> id(b)
2146597088
>>> c="some string"   <-----(1)
>>> d="some string"  
>>> id(c)
2146597208            <-----(1)
>>> a="some_string"
>>> b="some_string"
>>> id(a)
2146597248            <---- waited a few minutes
>>> c="some_string"
>>> d="some_string"
>>> id(d)
2146597248            <---- still same id after a few min
>>> b="some string"
>>> id(b)
2146597288
>>> b="some_string"  <---(2)
>>> id(b)
2146597248           <---(2)
>>> a="some"
>>> b="some"
>>> c="some"
>>> d="some"         <---(2) lost all references
>>> id(a)
2146601728
>>> a="some_string"  <---(2)
>>> id(a)
2146597248           <---(2) returns same old one after mere seconds
>>> a="some"
>>> id(a)
2146601728           <---(2) Waited a few minutes
>>> a="some_string"   <---- (1)
>>> id(a)
2146597208            <---- (1) Reused a"different" id after a few minutes

似乎在初始引用丢失且不再"使用中"(1)后,某些ID引用可能会被重用,但也可能与这些ID引用未被使用的时间有关,正如您在我标记为数字(2)的内容中看到的那样,根据ID未被使用的时间,给出不同的ID引用。我只是觉得好奇,想把它贴出来。