是操作员的困惑

nav*_*yad 7 python string

运算符是比较两个对象的内存地址(如果它们相同),则返回true,否则返回false. 代码#1

>>> a = "poi"
>>> b = "poi"
>>> a is b
True
Run Code Online (Sandbox Code Playgroud)

我创建了两个对象,其内容相同,但它们完全位于不同的内存地址上.那么为什么运算符返回true?不应该返回虚假.就像这段代码一样

>>> ktr = "today is a fine day"
>>> ptr = "today is a fine day"
>>> ktr is ptr
False
Run Code Online (Sandbox Code Playgroud)

voi*_*hos 6

我认为这与字符串实习有关.实质上,这个想法是只存储每个不同字符串的单个副本,以提高某些操作的性能.

基本上,工作的原因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'
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为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'
Run Code Online (Sandbox Code Playgroud)

至于为什么a is b仍然导致True,也许分配的字符串足够小以保证快速搜索实习集合,而另一个不是?