2013-06-20 13 views
15

पर विचार करें:== ऑपरेटर वास्तव में पाइथन शब्दकोश पर क्या करता है?

>>> a = {'foo': {'bar': 3}} 
>>> b = {'foo': {'bar': 3}} 
>>> a == b 
True 

अजगर दस्तावेज़ के अनुसार, शब्दकोशों पर you can indeed use== ऑपरेटर।

वास्तव में यहां क्या हो रहा है? क्या पाइथन समानता सुनिश्चित करने के लिए शब्दकोशों के प्रत्येक तत्व को दोबारा जांच रहा है? क्या यह सुनिश्चित कर रहा है कि चाबियाँ समान रूप से मेल खाती हैं, और मान भी समान रूप से मेल खाते हैं?

क्या ऐसे दस्तावेज हैं जो एक शब्दकोष पर == बिल्कुल निर्दिष्ट करते हैं? या क्या मुझे समानता की जांच के अपने संस्करण को लागू करना है या नहीं?

(== ऑपरेटर काम करता है, यही कारण है कि dicts dicts की hashable नहीं कर रहे हैं? यही है, मैं क्यों नहीं बना पा रहा एक सेट(), या एक शब्दकोश कुंजी के रूप में एक dict का उपयोग करें?)

+0

डिक्ट्स हैंशबल नहीं हैं क्योंकि वे उत्परिवर्तनीय हैं और उनका डेटा पिछले राज्यों के प्रति संवेदनशील है। बराबर राज्यों के दो डिक्ट्स होना आसान होगा, लेकिन एक धैर्य के इतिहास (अधिक डमी प्रविष्टियां युक्त) के कारण असमान हैश –

+1

@ स्लेटर टियरनस: आप आसानी से डमी प्रविष्टियों को अनदेखा कर सकते हैं; यह कोई मुद्दा नहीं है। उत्परिवर्तन एक बड़ा मुद्दा है। –

उत्तर

12

अजगर है समानता सुनिश्चित करने के लिए शब्दकोशों के प्रत्येक तत्व को दोबारा जांचना। C dict_equal() implementation देखें, जो प्रत्येक कुंजी और मूल्य की जांच करता है (बशर्ते शब्दकोश एक ही लंबाई हों); यदि b में एक ही कुंजी है, तो PyObject_RichCompareBool परीक्षण करता है यदि मान भी मेल खाते हैं; यह अनिवार्य रूप से एक रिकर्सिव कॉल है।

शब्दकोश hashable नहीं कर रहे हैं क्योंकि उनके __hash__ attribute is set to None, और सभी के अधिकांश वे परिवर्तनशील, जो जब एक शब्दकोश कुंजी के रूप में इस्तेमाल की अनुमति नहीं है कर रहे हैं।

यदि आप कुंजी के रूप में एक शब्दकोश का उपयोग करना चाहते थे, और किसी मौजूदा संदर्भ के माध्यम से कुंजी को बदलें, तो वह कुंजी अब हैश तालिका में एक ही स्थिति में स्लॉट नहीं होगी। मान का प्रयास करने और पुनर्प्राप्त करने के लिए एक और, बराबर शब्दकोश (इसे अपरिवर्तित शब्दकोश या बदले गए शब्दकोश के बराबर होना) का उपयोग करना अब काम नहीं करेगा क्योंकि गलत स्लॉट चुना जाएगा, या कुंजी अब बराबर नहीं होगी।

2

शब्दकोश समान हैं यदि उनके पास एक ही कुंजी और प्रत्येक कुंजी के लिए समान मान हैं।

कुछ उदाहरण देखें:

dict(a=1,b=2)==dict(a=2,b=1) 
False 

dict(a=1,b=2)==dict(a=1,b=2,c=0) 
False 

dict(a=1,b=2)==dict(b=2,a=1) 
True 
12

docs से:

मैपिंग (शब्दकोशों) की तुलना बराबर यदि और केवल यदि उनके अनुसार क्रमबद्ध (कुंजी, मूल्य) सूचियों बराबर की तुलना करें। [5] समानता के अलावा अन्य परिणाम लगातार हल किए गए हैं, लेकिन अन्यथा परिभाषित नहीं किए गए हैं। [6]

फ़ुटनोट [5]:

कार्यान्वयन इस कुशलता से गणना करता है, सूचियों के निर्माण या छँटाई के बिना।

फ़ुटनोट [6]: अजगर के

पिछले संस्करणों अनुसार क्रमबद्ध (कुंजी, मूल्य) सूचियों के कोषगत तुलना इस्तेमाल किया है, लेकिन इस समानता के लिए की तुलना के आम मामले के लिए बहुत महंगा था।पाइथन के एक पुराने संस्करण की तुलना में की तुलना केवल शब्दकोश द्वारा की गई थी, लेकिन इससे आश्चर्य हुआ क्योंकि लोगों को द्वारा खालीपन के लिए एक शब्दकोश का परीक्षण करने में सक्षम होने की उम्मीद है {}।

+3

ध्यान दें कि वास्तविक कार्यान्वयन बाएं हाथ के ऑपरेंड के लिए शब्दकोश ऑर्डर का उपयोग करता है, और चाबियों की संख्या अलग होने पर पहले बाहर निकलती है, जैसे ही अन्य कुंजी या संबंधित मानों में कोई कुंजी मौजूद नहीं होती है, बराबर तुलना नहीं की जाती है। –

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