亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python判斷兩個對象相等的原理

 更新時間:2017年12月12日 11:15:26   作者:xiaochao  
這篇文章主要介紹了Python判斷兩個對象相等的原理,需要的朋友可以參考下

概述

大部分的python程序員平時編程的時候,很少關(guān)心兩個對象為什么相等,因為教程和經(jīng)驗來說,他們就應該相等,比如1==1就應該返回True,可是當我們想要定義自己的對象或者修改默認的對象行為時,通常會因為不了解原理而導致各種奇奇怪怪的錯誤。

兩個對象如何相等

兩個對象如何才能相等要比我們想象的復雜很多,但核心的方法是重寫 eq 方法,這個方法返回True,則表示兩個對象相等,否則,就不相等。相反的,如果兩個對象不相等,則重寫 ne 方法。 默認情況下,如果你沒有實現(xiàn)這個方法,則使用父類(object)的方法。父類的方法比較是的兩個對象的ID(可以通過id方法獲取對象ID),也就是說,如果對象的ID相等,則兩個對象也就相等。因此,我們可以得知,默認情況下,對象只和自己相等。例如:

>>> class A(object):
...  pass
...
>>>
>>> a = A()
>>> b = A()
>>> a == a
True
>>> a == b
False
>>> id(a)
4343310992
>>> id(b)
4343310928

Python2程序員經(jīng)常犯的一個錯誤是,只重寫了 eq 方法,而沒有重寫 ne 方法,導致不可預計的錯誤。而Python3會自動重寫 ne 方法,如果你沒有重寫的話。

對象的Hash方法

Python里可Hash的對象,都有一個數(shù)字ID代表了它在python里的值,這個ID是由對象的 hash 方法返回的。因此,如果想讓一個對象可Hash,那必須實現(xiàn) hash 方法和之前提到的 eq 方法。和對象相等一樣,默認情況下,對象的 hash 方法繼承自O(shè)bject對象,而Object對象的 hash 方法只計算對象ID,因此兩個對象始終擁有兩個不一樣的hash id,不管他們是多么相似。 當我們把一個不可Hash的對象加入到set或者dict時,會發(fā)生什么了?

>>> set().add({})
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
unhashable type: 'dict'

原因是set()和dict()使用對象的hash值作為內(nèi)部索引,以便能快速索引到指定對象。因此,同一個對象返回相同的hash id就很重要了。

對象的Hash值在它的生命周期內(nèi)不能改變

如果你想定義一個比較完美的對象,并且實現(xiàn)了 eq 和 hash 方法來定義對象的比較行為和hash值,那么你就需要保證對象的相關(guān)屬性不能發(fā)生更改。不然會導致很詭異的錯誤,比如下面的例子。

>>> class C:
...  def __init__(self, x):
...   self.x = x
...  def __repr__(self):
...   return "C({"+str(self.x)+"})"
...  def __hash__(self):
...   return hash(self.x)
...  def __eq__(self, other):
...   return (
...    self.__class__ == other.__class__ and
...    self.x == other.x
...   )
>>> d = dict()
>>> s = set()
>>> c = C(1)
>>> d[c] = 42
>>> s.add(c)
>>> d, s
({C(1): 42}, {C(1)})
>>> c in s and c in d # c is in both!
True
>>> c.x = 2
>>> c in s or c in d # c is in neither!?
False
>>> d, s
({C(2): 42}, {C(2)}) # but...it's right there!

在我們沒有修改對象的屬性時(c.x=2)之前,所有行為都符合預期。當我們通過c.x=2時修改屬性后,執(zhí)行c in s or c in d返回False,但是內(nèi)容卻是修改后的,是不是很奇怪。這也就解釋了為什么str、tuple是可Hash的,而list和dict是不可hash的。

因此我們可以得出結(jié)論,如果兩個對象相等的話,那它們的hash值必然也是相等的。

總結(jié)

講了這么多有什么用了。 1. 當我們遇到unhashable type這個異常時,我們能夠知道為什么報這個錯誤。 2. 如果定義了一個可比較的對象,那么最好保證對象hash值相關(guān)的屬性在生命周期內(nèi)不能發(fā)生改變,不然會發(fā)生意想不到的錯誤。

以上所述是小編給大家介紹的Python判斷兩個對象相等的原理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • pytorch中的dataloader使用方法詳解

    pytorch中的dataloader使用方法詳解

    這篇文章主要介紹了pytorch中的dataloader使用方法詳解,構(gòu)建自己的dataloader是模型訓練的第一步,本篇文章介紹下pytorch與dataloader以及與其相關(guān)的類的用法,需要的朋友可以參考下
    2023-11-11
  • 200個Python?標準庫總結(jié)

    200個Python?標準庫總結(jié)

    這篇文章主要給大家分享了200個Python?標準庫總結(jié),主要對文本、數(shù)據(jù)類型、數(shù)學等多個類型總結(jié),既有一定的參考價值,需要的小伙伴可以參考一下
    2022-01-01
  • python使用webbrowser瀏覽指定url的方法

    python使用webbrowser瀏覽指定url的方法

    這篇文章主要介紹了python使用webbrowser瀏覽指定url的方法,實例分析了Python操作webbrowser模塊的技巧,非常簡單實用,需要的朋友可以參考下
    2015-04-04
  • Python超簡單容易上手的畫圖工具庫(適合新手)

    Python超簡單容易上手的畫圖工具庫(適合新手)

    這篇文章主要給大家介紹了關(guān)于Python超簡單容易上手的畫圖工具庫的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • Python中的random.choices函數(shù)用法詳解

    Python中的random.choices函數(shù)用法詳解

    這篇文章主要給大家介紹了關(guān)于Python中random.choices函數(shù)用法的相關(guān)資料,random.random()?的功能是隨機返回一個?0-1范圍內(nèi)的浮點數(shù),文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-08-08
  • Python尾遞歸優(yōu)化實現(xiàn)代碼及原理詳解

    Python尾遞歸優(yōu)化實現(xiàn)代碼及原理詳解

    這篇文章主要介紹了Python尾遞歸優(yōu)化實現(xiàn)代碼及原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Python之np.where()如何替換缺失值

    Python之np.where()如何替換缺失值

    這篇文章主要介紹了Python中的np.where()如何替換缺失值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python基于Node2Vec實現(xiàn)節(jié)點分類及其可視化示例詳解

    python基于Node2Vec實現(xiàn)節(jié)點分類及其可視化示例詳解

    這篇文章主要為大家介紹了python基于Node2Vec實現(xiàn)節(jié)點分類及其可視化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • python實現(xiàn)kNN算法

    python實現(xiàn)kNN算法

    這篇文章主要為大家詳細介紹了python實現(xiàn)kNN算法的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Python基于pycrypto實現(xiàn)的AES加密和解密算法示例

    Python基于pycrypto實現(xiàn)的AES加密和解密算法示例

    這篇文章主要介紹了Python基于pycrypto實現(xiàn)的AES加密和解密算法,結(jié)合實例形式分析了Python使用pycrypto模塊進行AES加密與解密操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-04-04

最新評論