使用對象id
作爲散列鍵(通過__hash__
)能夠爲程序的單個實例散列另外可變對象是明智嗎?使用對象屬性會更好,但它們都是可變的,並且可以改變。使用對象ID作爲Python中對象的散列
這件事發生在我看着Sets of instances,我想知道這是否明智。
使用對象id
作爲散列鍵(通過__hash__
)能夠爲程序的單個實例散列另外可變對象是明智嗎?使用對象屬性會更好,但它們都是可變的,並且可以改變。使用對象ID作爲Python中對象的散列
這件事發生在我看着Sets of instances,我想知道這是否明智。
是的,只要你還定義__eq__
(和大概__ne__
! - )一致。 IOW,沒關係,只要你沒問題,a==b
的含義與a is b
完全一樣! - )
對於大多數Python類,這是默認行爲。難以置信的原因是有一個很好的理由:它們是可變的集合。
對於集合,基於它們的內容相等具有相等關係(由__eq__()
定義)是實際的。這和__hash__()
要求平等的要求,當然會使得__hash__()
可變,這對於包含這些對象的集合來說將是可怕的。
所以你可以做到這一點,但它會花費你基於內容的平等關係。
謝謝。你的第二句話很好地闡明瞭它。 – 2010-01-11 05:42:39