अपरिवर्तनीय का अर्थ है कि वस्तु अपने जीवनकाल के दौरान किसी भी महत्वपूर्ण तरीके से नहीं बदलेगी। यह प्रोग्रामिंग भाषाओं में एक अस्पष्ट लेकिन सामान्य विचार है।
Hashability थोड़ा अलग है, और तुलना करने के लिए संदर्भित करता है।
hashable एक वस्तु hashable है अगर यह एक हैश मान जो अपने जीवनकाल (यह एक जरूरत है के दौरान बदल जाता है कभी नहीं है__hash__()
विधि), और अन्य वस्तुओं (यह एक जरूरत की तुलना में किया जा सकता है__eq__()
या__cmp__()
विधि)। हेशिबल ऑब्जेक्ट जो समान की तुलना करते हैं, उनका समान हैश मान होना चाहिए।
सभी उपयोगकर्ता-परिभाषित कक्षाओं में __hash__
विधि होती है, जो डिफ़ॉल्ट रूप से ऑब्जेक्ट आईडी को वापस कर देती है। तो एक वस्तु जो हैशबिलिटी के मानदंडों को पूरा करती है, जरूरी नहीं कि अपरिवर्तनीय हो।
आपके द्वारा घोषित किसी भी नए वर्ग की वस्तुओं को शब्दकोश कुंजी के रूप में उपयोग किया जा सकता है, जब तक कि आप इसे रोकते नहीं हैं, उदाहरण के लिए, इससे फेंकना __hash__
हम कह सकते हैं कि सभी अपरिवर्तनीय वस्तुएं हैंज़ेबल हैं, क्योंकि यदि ऑब्जेक्ट के जीवनकाल के दौरान हैश बदल जाता है, तो इसका मतलब है कि ऑब्जेक्ट उत्परिवर्तित हो गया है।
लेकिन काफी नहीं। एक टपल पर विचार करें जिसमें एक सूची (परस्पर) है। कुछ लोग कहते हैं कि टप्पर अपरिवर्तनीय है, लेकिन एक ही समय में यह कुछ हद तक नहीं है।
d = dict()
d[ (0,0) ] = 1
d[ (0,[0]) ] = 1
Hashability और अपरिवर्तनीयता ऑब्जेक्ट इंस्टेंसेस को संदर्भित करते हैं, टाइप नहीं। उदाहरण के लिए, टाइप टपल का एक ऑब्जेक्ट हैज़ेबल हो सकता है या नहीं।
HashMap
आप एक कुंजी के रूप में उपयोग की जाने वाली वस्तु को संशोधित करते हैं तो टूट जाता है: न तो पुरानी और न ही नई कुंजी मिल सकती है, भले ही आप नक्शे को प्रिंट करते हों, यह वहां देखा जा सकता है।