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字符串,这决定了字符串的未来实例是否共享引用。
如果它决定实习生一个字符串,那么两者都将引用同一个字符串实例。如果不这样做,它将创建两个恰好具有相同内容的独立字符串。
一般来说,你不必担心是否会发生这种情况;你通常想检查平等,
蒂姆·彼得斯说:"对不起,我在这里看到的唯一错误就是你用"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引用。我只是觉得好奇,想把它贴出来。