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']
---------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM