国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-16 11:03:24
字體:
來源:轉載
供稿:網友

概述

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

兩個對象如何相等

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

>>> class A(object):...  pass...>>>>>> a = A()>>> b = A()>>> a == aTrue>>> a == bFalse>>> id(a)4343310992>>> id(b)4343310928

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

對象的Hash方法

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

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

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

對象的Hash值在它的生命周期內不能改變

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

>>> 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!            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 逊克县| 乌海市| 柳河县| 汽车| 安仁县| 六安市| 彩票| 上杭县| 延庆县| 赣州市| 万年县| 龙江县| 固安县| 巨野县| 六枝特区| 邢台市| 扶绥县| 丹寨县| 盐津县| 贺兰县| 保定市| 木兰县| 志丹县| 清丰县| 图们市| 襄汾县| 神农架林区| 南平市| 湘西| 民县| 克拉玛依市| 监利县| 平罗县| 台中县| 定兴县| 德令哈市| 星座| 衡南县| 叶城县| 泽库县| 新丰县|