मैं समझने की कोशिश कर रहा हूं कि एक कुंजी का पता लगाने के लिए पाइथन शब्दकोशों को आंतरिक रूप से क्या करना चाहिए। मुझे ऐसा लगता है कि हैश का मूल्यांकन पहले किया जाएगा, और अगर टक्कर हो, तो पाइथन चाबियों के माध्यम से फिर से चालू हो जाएंगे, जब तक कि यह eq सत्य लौटाता है। मुझे कौन सा बना देता है क्यों निम्नलिखित कोड (केवल आंतरिक को समझने के लिए परीक्षण कोड) काम करता है आश्चर्य:पायथन के लिए __hash__ और __eq__ मूल्यांकन का आदेश क्या है?
class MyClass(object):
def __eq__(self, other):
return False
def __hash__(self):
return 42
if __name__=='__main__':
o1 = MyClass()
o2 = MyClass()
d = {o1: 'o1', o2: 'o2'}
assert(o1 in d) # 1
assert(d[o1]=='o1') # 2
assert(o2 in d) # 3
assert(d[o2]=='o2') # 4
नहीं शब्दकोश सही कुंजी (लौटने या तो दोनों में 'O1' या 'o2' को खोजने में असमर्थ होना चाहिए आंतरिक कार्यान्वयन के आधार पर मामलों # 2 और # 4, या एक त्रुटि फेंकना)। यह दोनों मामलों में सही कुंजी पर उतरने में सक्षम कैसे है, जब यह कभी भी कुंजी को सही ढंग से 'बराबर' करने में सक्षम नहीं होना चाहिए (eq गलत लौटाता है)।
सभी प्रलेखन मैं hashing पर देखा है हमेशा हैश और eq एक साथ, कभी नहीं सीएमपी, ne आदि, जो मुझे लगता है कि इन 2 केवल लोगों को है कि इस में एक भूमिका निभा रहे हैं बनाता है का उल्लेख है परिदृश्य।
तो उनके उदाहरण में ओ 1 == ओ 1 गलत हो जाएगा, लेकिन आईडी (ओ 1) == आईडी (ओ 1) सच हो जाएगा? –
मैंने अभी कोशिश की है और o1 == o1 रिटर्न गलत और आईडी (ओ 1) == आईडी (ओ 1) सही –
@TimurRidjanovic देता है: हाँ। यद्यपि ऑब्जेक्ट पहचान की तुलना करने के लिए 'सुरक्षित' एक सुरक्षित और कभी-कभी अधिक प्रभावी तरीका है। – user2357112