当比较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时,可以通过执行快速指针比较(回落速度较慢)来加快键的哈希函数/等式检查.