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__的主要内容,如果未能解决你的问题,请参考以下文章

python2的比较函数,cmp

python中 __cmp__

python进阶五(定制类)5-2 python中__cmp__

python中的is==和cmp()比较字符串

python3中的比较函数

USACO_1.1_Your_Ride_Is_Here_(字符串+水题)