2016-06-29 4 views
5

मैं समझने की कोशिश कर रहा हूं कि एक कुंजी का पता लगाने के लिए पाइथन शब्दकोशों को आंतरिक रूप से क्या करना चाहिए। मुझे ऐसा लगता है कि हैश का मूल्यांकन पहले किया जाएगा, और अगर टक्कर हो, तो पाइथन चाबियों के माध्यम से फिर से चालू हो जाएंगे, जब तक कि यह 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 केवल लोगों को है कि इस में एक भूमिका निभा रहे हैं बनाता है का उल्लेख है परिदृश्य।

उत्तर

5

जो भी आप एक dict कुंजी के रूप में उपयोग करते हैं, उसे bool(x == x) is True पर आविष्कार को संतुष्ट करना होगा। (मैंने केवल x == x कहा होगा, लेकिन उचित वस्तुएं हैं जिनके लिए यह भी एक बूलियन नहीं है।)

यह मानता है कि यह पकड़ जाएगा, इसलिए नियमित समानता की जांच करने के लिए नियमित रूप से उपयोग की जाने वाली नियमित रूप से ऑब्जेक्ट पहचान की जांच करती है == का उपयोग करने से पहले। यह प्रारंभिक जांच एक कार्यान्वयन विस्तार है; आपको इस पर भरोसा नहीं करना चाहिए या नहीं हो रहा है।

उचित ऑब्जेक्ट्स जिसके लिए (x == x) is not True में float('nan') और numpy.array([1, 2]) शामिल हैं।

+0

तो उनके उदाहरण में ओ 1 == ओ 1 गलत हो जाएगा, लेकिन आईडी (ओ 1) == आईडी (ओ 1) सच हो जाएगा? –

+0

मैंने अभी कोशिश की है और o1 == o1 रिटर्न गलत और आईडी (ओ 1) == आईडी (ओ 1) सही –

+0

@TimurRidjanovic देता है: हाँ। यद्यपि ऑब्जेक्ट पहचान की तुलना करने के लिए 'सुरक्षित' एक सुरक्षित और कभी-कभी अधिक प्रभावी तरीका है। – user2357112

संबंधित मुद्दे