将unicode对象与字符串对象进行比较时出现奇怪的行为

 手机用户2602890095 发布于 2023-02-12 12:25

当比较python中的两个字符串时,它工作正常,当比较一个string对象与一个unicode对象时,它会按预期失败,但是当比较一个string对象与转换后的unicode (unicode --> str)对象时,它会失败

演示:

按预期工作:

>>> if 's' is 's': print "Hurrah!"
... 
Hurrah!

差不多是啊:

>>> if 's' is u's': print "Hurrah!"
... 

没想到:

>>> if 's' is str(u's'): print "Hurrah!"
... 

当两个类型属于同一类时,为什么第三个示例不能按预期工作?

>>> type('s')


>>> type(str(u's'))

mgilson.. 12

不要is用于此,请使用==.您正在比较对象是否具有相同的身份,而不是它们是否相等.当然,如果它们是相同的对象,它们将是相等的(==),但如果它们相等,则它们不一定是同一个对象.

第一个工作的事实是CPython 的实现细节.小字符串,因为它们是不可变的,可以由解释器实现.每次将字符串"s"放入源代码中时,Cpython都会重用相同的对象.但是,显然会str("s")返回一个具有相同值的新字符串.这并不奇怪.


你可能会问自己,"为什么要根据字符串实习's'?".这是一个合理的问题.毕竟,它是一个短小的字符串 - 在你的源代码中有多少内存可以有多个副本?答案(我认为)是因为字典查找.由于带有字符串作为键的dicts在python中非常常见,因此strcmp当指针比较返回false时,可以通过执行快速指针比较(回落速度较慢)来加快键的哈希函数/等式检查.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有