小编典典

对带有字符串的`is`运算符感到困惑

python

is运算符比较两个对象的内存地址,并返回True如果它们是相同的。那么,为什么它不能与字符串可靠地一起工作呢? 代码#1

>>> 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运算符的输出不一致?


阅读 167

收藏
2020-12-20

共1个答案

小编典典

我相信这与字符串实习有关。从本质上讲,其思想是仅存储每个不同字符串的单个副本,以提高某些操作的性能。

基本上,a is b起作用的原因是(正如您可能已经猜到的)在这两种情况下,Python都引用了一个不变的字符串。当字符串很大(很可能还有其他一些我不理解的因素)时,则不会这样做,这就是第二个示例返回False的原因。

编辑:事实上,奇怪的行为似乎是交互式环境的副作用。如果你把你相同的代码,并把它变成一个Python脚本,都a is bktr 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'

至于为什么a is b仍然结果为True,也许分配的字符串足够小以保证可以快速搜索到内部集合,而另一个则不能?

2020-12-20