我相信这与字符串实习有关。从本质上讲,其思想是仅存储每个不同字符串的单个副本,以提高某些操作的性能。
基本上,a is b
起作用的原因是(正如您可能已经猜到的)在这两种情况下,Python都引用了一个不变的字符串。当字符串很大(很可能还有其他一些我不理解的因素)时,则不会这样做,这就是第二个示例返回False的原因。
编辑:事实上,奇怪的行为似乎是交互式环境的副作用。如果你把你相同的代码,并把它变成一个Python脚本,都a is b
和ktr is ptr
返回True。
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'