>> b = "poi" >>> a is b True 代码-6ren">
gpt4 book ai didi

python - 对 `is` 运算符与字符串感到困惑

转载 作者:太空宇宙 更新时间:2023-11-03 21:06:09 27 4
gpt4 key购买 nike

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

最佳答案

我相信这与string interning.有关本质上,这个想法是只存储每个不同字符串的单个副本,以提高某些操作的性能。

基本上,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,也许分配的字符串足够小,足以保证快速搜索interned集合,而另一个则不然?

关于python - 对 `is` 运算符与字符串感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55383410/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com