पर कॉल करते हैं तो मेरे पास कक्षा है (चलो इसे myClass
पर कॉल करें) जो __hash__
और __eq__
दोनों लागू करता है। मेरे पास dict
भी है जो कुछ मूल्यों के लिए myClass
ऑब्जेक्ट्स को मानचित्र करता है, कंप्यूटिंग जिसमें कुछ समय लगता है।क्या होता है जब आप 'अगर कुंजी में कुंजी'
मेरे कार्यक्रम के दौरान, कई (लाखों के क्रम में) myClass
ऑब्जेक्ट्स तत्काल हैं। यही कारण है कि मैं उन मानों का ट्रैक रखने के लिए dict
का उपयोग करता हूं।
हालांकि, कभी-कभी एक नया myClass
ऑब्जेक्ट पुराने के बराबर हो सकता है (जैसा कि __eq__
विधि द्वारा परिभाषित किया गया है)। तो उस ऑब्जेक्ट के मान को फिर से गणना करने के बजाय, मैं बस dict
में पुराने myClass
ऑब्जेक्ट के मान को देखना चाहूंगा। इसे पूरा करने के लिए, मैं if myNewMyClassObj in dict
करता हूं।
यहाँ मेरे सवाल है:
मुझे लगता है कि in
खंड का उपयोग करते हैं, क्या कहा जाता हो जाता है, __hash__
या __eq__
? dict
का उपयोग करने का बिंदु यह है कि यह ओ (1) लुकअप समय है। तो __hash__
कहा जाना चाहिए। लेकिन क्या होगा यदि __hash__
और __eq__
समकक्ष विधियां नहीं हैं? उस स्थिति में, क्या मुझे if myNewMyClassObj in dict
के लिए झूठी सकारात्मक मिलेगी?
सवाल को का पालन करें:
मैं अपने dict
में प्रविष्टियों की संख्या कम करना चाहते हैं, तो मैं आदर्श रूप dict
में बराबर myClass
वस्तुओं का एक सेट का केवल एक ही रखना चाहते हैं। तो फिर, ऐसा लगता है कि जब if myNewClassObj in dict
कंप्यूटिंग के नाम से जाना __eq__
जरूरत है, जो एक dict
की हे अशुद्ध हैं (1) एक हे करने के लिए समय देखने (एन) समय देखने
@MartijnPieters: मैं बस उन्हें शामिल करने से पहले गलती से बचाता हूं, वे अब वहां हैं। – BrenBarn
शानदार उदाहरण! – inspectorG4dget
पायथन अपनी हैश तालिकाओं में बाल्टी का उपयोग नहीं करता है: यह प्रत्येक स्लॉट के साथ स्लॉट का उपयोग करता है जिसमें एकल मान होता है। यदि एक स्लॉट भरा हुआ है तो यह एक और स्लॉट का चयन करेगा और तब तक जब तक कोई मैच या अप्रयुक्त स्लॉट न मिले। – Duncan