python 关于input输入的字符串不能用is判断

python 关于input输入的字符串不能用is判断

我是小白,最近在看字符串的问题,看了一些教程知道input获得的字符串用is去判断的时候得到的结果为false,这是由于input是底层封装的函数,但我发现另外个问题

s1 = input('请输入:')

s2 = input('请输入:')

print(s1 == s2)

print(id(s1),id(s2))

print(s1 is s2)

结果如下:
请输入:bn
请输入:bn
True
2325871254528 2325871254360
False

这个结果符合之前的答案

但如果我只输入一个字符,结果就不一样了:
请输入:b
请输入:b
True
1862569949144 1862569949144
True

这是为啥,我在网上搜也找不到答案,有大神可以讲解一下吗?为啥输入一个字符串的情况下id地址是一样的?


回答:

补充一些楼上@zuch的内容。

实际上单个字符组成的字符串(即字符)和小整型并不一样,小整型的确是Python预先分配的:

[longobject.c] - Python 3.8
Small integers are preallocated in this array so that they can be shared.
The integers that are preallocated are those in the range -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).

但字符不是,对于字符的处理,Python并没有预分配字符(相关源码文件[bytesobject.c]),而是第一次创建一个字符时,将其缓存在一个缓冲池中,下次再出现该字符时,直接从缓冲池中获取。

当然这个差异并不影响你的问题。
事实上,小整型所用到的这种技术也叫做缓冲池,或对象池对象缓冲池。所以,如果你想去网上查更详细的资料的话,搜这几个关键字就行了,但一切还是以官方文档和源码为准。


回答:

Python 针对一些常用 不可变量(如 小整数、单个字符的字符串、空元组 等等) 预先分配,所以实际它们都指向同一个对象,id 自然就是相同的了

这样做的主要是为了 节省内存


针对你的问题,需要注意的是,Python 中 == 是用来判断值是否相同的;而 is 关键字是用来判断两个变量是否引用同一个对象的。不要混用!


最后附上一点学习建议:

学习 Python 的时候,最好的学习资料是 Python 的官方文档(现已经有中文),因为它永远是最新且最具权威的。网上的学习资料当做辅助即可

以上是 python 关于input输入的字符串不能用is判断 的全部内容, 来源链接: utcz.com/a/164894.html

回到顶部