该is运算符比较两个对象的内存地址,并返回True如果它们是相同的。那么,为什么它不能与字符串可靠地一起工作呢? 代码#1
is
True
>>> a = "poi" >>> b = "poi" >>> a is b True
代码#2
>>> ktr = "today is a fine day" >>> ptr = "today is a fine day" >>> ktr is ptr False
我创建了两个字符串,它们的内容相同,但是它们位于不同的内存地址上。为什么is运算符的输出不一致?
我相信这与字符串实习有关。从本质上讲,其思想是仅存储每个不同字符串的单个副本,以提高某些操作的性能。
基本上,a is b起作用的原因是(正如您可能已经猜到的)在这两种情况下,Python都引用了一个不变的字符串。当字符串很大(很可能还有其他一些我不理解的因素)时,则不会这样做,这就是第二个示例返回False的原因。
a is b
编辑:事实上,奇怪的行为似乎是交互式环境的副作用。如果你把你相同的代码,并把它变成一个Python脚本,都a is b和ktr is ptr返回True。
ktr is ptr
a="poi" b="poi" print a is b # Prints 'True' ktr = "today is a fine day" ptr = "today is a fine day" print ktr is ptr # Prints 'True'
这很有意义,因为Python很容易解析源文件并在其中查找重复的字符串文字。如果动态创建字符串,那么即使在脚本中,其行为也有所不同。
a="p" + "oi" b="po" + "i" print a is b # Oddly enough, prints 'True' ktr = "today is" + " a fine day" ptr = "today is a f" + "ine day" print ktr is ptr # Prints 'False'
至于为什么a is b仍然结果为True,也许分配的字符串足够小以保证可以快速搜索到内部集合,而另一个则不能?