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

K D*_*awG 6 python unicode python-2.7

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

演示:

按预期工作:

>>> if 's' is 's': print "Hurrah!"
... 
Hurrah!
Run Code Online (Sandbox Code Playgroud)

差不多是啊:

>>> if 's' is u's': print "Hurrah!"
... 
Run Code Online (Sandbox Code Playgroud)

没想到:

>>> if 's' is str(u's'): print "Hurrah!"
... 
Run Code Online (Sandbox Code Playgroud)

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

>>> type('s')
<type 'str'>

>>> type(str(u's'))
<type 'str'>
Run Code Online (Sandbox Code Playgroud)

mgi*_*son 12

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

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


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