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