2013-04-24 11 views
8

मैं एक शब्दकोश में एक कुंजी की उपस्थिति का परीक्षण करना चाहता हूं क्योंकि 'अगर कुंजी शब्दकोश में नहीं है: कुछ करें' मैंने पहले से ही यह कई बार किया है, लेकिन इस बार यह अजीब तरीके से व्यवहार करता है।पायथन 2.7 एक शब्दकोश में उपस्थिति

विशेष रूप से: किसी को भी समझते हो कि यह कैसे है

term in termCircutiMap  # prints False 
term in termCircuitMap.keys() # prints True 

:

termCircuit = termCircuitMap[term] 

रिटर्न KeyError

जब मैं ग्रहण PyDev में इस कोड डिबग, मैं निम्नलिखित (का उपयोग कर भाव) मिला मुमकिन? मैंने सोचा कि अगर कुंजी सेट में कुछ है तो यह शब्दकोश में 'इन' है।

मैं मूल्यांकन का एक स्क्रीनशॉट संलग्न कर रहा हूं।

http://img836.imageshack.us/img836/1274/screenshotpython.png

धन्यवाद समझा :)

+1

यह अजीब बात है ... क्या इन दो सशर्त बयानों के बीच कोई कोड है? –

+1

यदि आप वास्तव में तत्काल उत्तराधिकार में उन दो पंक्तियों को चला रहे हैं तो त्रुटि के लिए कोई स्पष्टीकरण नहीं है। 'डिक्ट में कुंजी' वास्तव में ADict.keys() 'में कुंजी से बेहतर और बेहतर है, लेकिन वे _should_ दोनों एक ही मान वापस कर देते हैं। क्या यह संभव है कि कुछ चेक के बीच शब्दकोश को संशोधित किया हो? –

+9

क्या आप वास्तविक कोड का एक उदाहरण दिखा सकते हैं जो समस्या का प्रदर्शन करता है? आपके निर्देश में चाबियों का प्रकार क्या है? यह व्यवहार संभव हो सकता है यदि कुंजी असंगत हैश/समानता परिभाषाओं के साथ वस्तुएं हैं। – BrenBarn

उत्तर

11

आप इस व्यवहार को देख सकते हैं, तो अपने प्रमुख के __hash__ समारोह ठीक से परिभाषित नहीं किया गया है के लिए एक बहुत। जैसे, निम्नलिखित लगभग एक ही व्यवहार आप का वर्णन के रूप में देता है:

import random 

class Evil(int): 
    def __hash__(self): 
     return random.randint(0, 10000) 

evil_vals = [Evil(n) for n in range(10)] 

dict_with_evil_keys = dict((evil_val, None) 
          for evil_val in evil_vals) 

print evil_vals[0] in dict_with_evil_keys # prints False 
print evil_vals[0] in dict_with_evil_keys.keys() # prints True 

इस मामले में, मैं यादृच्छिक हैश मान है, जो स्पष्ट रूप से एक बुरा विचार है पैदा कर रहा हूँ। एक कम स्पष्ट समस्या जिसका वही प्रभाव हो सकता है यदि आपके प्रमुख मान म्यूटेबल हैं। (आम तौर पर, परिवर्तनीय मानों को __hash__ को परिभाषित नहीं करना चाहिए, और शब्दकोशों में कुंजी के रूप में उपयोग नहीं किया जाना चाहिए।)

+2

गह! मुझे एक ही चीज़ लिखने में बहुत लंबा लगा। केवल एक चीज जो मैं जोड़ सकता हूं वह '__hash__' विधि के नियमों का एक लिंक है: http://docs.python.org/2/reference/datamodel.html#object.__hash__ –

+0

धन्यवाद, जाहिर है कि समस्या यह थी कि मैंने सोचा कि वस्तुओं अपरिवर्तनीय हैं लेकिन वे नहीं थे।तो यहां बताया गया है कि यह स्थिति कैसे हो सकती है, अगर कोई उत्सुक है: o = SomeClass() # लिखने योग्य रूप से अपरिवर्तनीय होना चाहिए – jlanik

+0

ठीक है, क्षमा करें दोस्तों, मैं स्पष्ट रूप से टिप्पणियों में कोड डालने के लिए गूंगा हूं। तो यहाँ उदाहरण है: ओ = SomeClass() नक्शा [ओ] = कोई नहीं #now हैश (ओ) == एक्स मे बदलें (ओ) #now हैश (ओ) == y ओ नक्शे में #prints झूठा, क्योंकि ओ का हैश x था जब इसे ओ में जोड़ा गया था .keys() #prints True, क्योंकि map.keys() एक सूची है और सूची में उपस्थिति हैश कंप्यूटिंग (i अनुमान ...) – jlanik

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