[英]Why iterators and generators are hashable?
如題。 我的意思是,您可以調用next(obj)
並指向下一個元素。 所以迭代器或生成器的內部 state 會發生變化。
為什么它們是可散列的?
散列對象的一般規則是:
__eq__
被覆蓋,否則 object 相等性由身份定義,並且散列匹配__eq__
被覆蓋,而__hash__
未被覆蓋,則默認情況下會阻止散列(因為影響相等性檢查結果的可變性會破壞 hash 不變量); 重新啟用散列需要實現__hash__
,它隱含地說“我的相等性和 hash 語義隨着時間的推移是穩定/一致的”,但不要求與相等性無關的事物或 hash 代碼是穩定的。 關鍵是,哈希性的條件不是不變性,而是與相等性的一致性(以及相等性和哈希的隱含穩定性)。 由於大多數迭代器和所有生成器都沒有實現__eq__
(沒有有意義的方法來實現它而不用完迭代器並丟失你剛剛用來比較它的信息),它都是基於身份的,就像任何用戶定義的一樣object 沒有定義相等。
雖然生成器的內部 state 可以更改,但生成器作為一個整體永遠不能向自身添加任何東西,並且 go 在迭代它時永遠不能退一步。 因此,生成器是一個固定不變的 object,這幾乎是可哈希的定義。
但更深層次的是,即使可變對象也可以是可散列的,只要它們將__hash__
定義為實例方法,但這對於可變對象來說很少需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.