Python之字符串比较is==__cmp__
Posted liyanyan665
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之字符串比较is==__cmp__相关的知识,希望对你有一定的参考价值。
0、str这个class,很常用,也经常可以看到两个字符串,进行is或者==的比较
is 和 ==
a、is表示对比的是对象标识符(即内存地址),用来检查对象的标识符是否一致,即两个对象在内存中的地址是否一致(对象首字节的内存地址(你经常看到到的地址要么是十六进制展示的,要么就是十进制的))
b、在使用 strA is strB 的时候,相当于id(strA)==id(strB),因为字符串是不可变对象,所以又有字符串池的概念,所以is对比如果返回True,那么==也一定会返回True
1、==表示两个对象的值是否相等,相当于调用了__eq__()这个魔法方法,即strA == strB 相当于 strA.__eq__(strB)
str重写了__eq__方法
2、这次的话,我们再多介绍一个魔法方法__cmp__(一个Python3.x下已经遗弃的宝贝)
__cmp__
a、int、str 等内置数据类型排序时,Python的 sorted() 按照默认的比较函数 __cmp__的返回值进行排序(int、str也重写了__cmp__(python2.x下)
b、int、str现在已经废弃了__cmp__这个魔法(python3.x下)),废弃了__cmp__方法后,则新定义了 __eq__, __ne__, __lt__, __gt__ 等各种新的魔法方法
但是这个Python2.x下的知识点也要知道……,以下语法为Python2.x
但是,如果对一组 Person 类的实例对象需要排序时,就必须提供我们自己的特殊方法 __cmp__():
class Person(object):
def __init__(self, name, age):
self.name = name(http://www.amjmh.com)
self.age = age
def __str__(self):
return ‘(%s: %s)‘ % (self.name, self.age)
__repr__ = __str__
def __cmp__(self, other):
if self.name < other.name:
return -1
elif self.name > other.name:
return 1
else:
return 0
上述 Student 类实现了__cmp__()方法,__cmp__用实例自身self和传入的实例 other 进行比较,如果 self 小于其他对象 ,就返回 -1,如果 s 大于其他对象,就返回1,如果两个对象相等,就返回 0。
这边为了加强理解,假设换成数字就更能明白-1、1、0的用意了,你想想看呢?
Person类实现了按name进行排序:
>>> L = [Person(‘Tim‘, 25), Person(‘Bob‘, 30), Person(‘Alice‘, 23)]
>>> print sorted(L)
[(Alice: 23), (Bob: 30), (Tim: 25)]
对于比较的字符串,按照字符的ASCII码进行比较,显然是按照第一位字符的ASCII码进行的比较
注意: 如果list中的元素不仅仅包含 Person 类的对象,则 __cmp__ 会报错:
L = [Person(‘Tim‘, 25), Student(‘Bob‘, 30, 100, ‘Hello‘]
---------------------
以上是关于Python之字符串比较is==__cmp__的主要内容,如果未能解决你的问题,请参考以下文章