पायथन में बुनियादी डेटा संरचनाओं में से एक शब्दकोश है, जो किसी भी प्रकार के "मूल्यों" को देखने के लिए "कुंजी" रिकॉर्ड करने की अनुमति देता है। क्या यह आंतरिक रूप से हैश टेबल के रूप में लागू किया गया है? यदि नहीं, तो यह क्या है?
पायथन में बुनियादी डेटा संरचनाओं में से एक शब्दकोश है, जो किसी भी प्रकार के "मूल्यों" को देखने के लिए "कुंजी" रिकॉर्ड करने की अनुमति देता है। क्या यह आंतरिक रूप से हैश टेबल के रूप में लागू किया गया है? यदि नहीं, तो यह क्या है?
जवाबों:
हां, यह हैश मैपिंग या हैश टेबल है। के रूप में, टिम पीटर्स ने लिखा आप, अजगर के dict कार्यान्वयन का एक विवरण पढ़ सकते हैं यहाँ ।
इसीलिए आप एक सूची की तरह एक तानाशाही कुंजी के रूप में 'नॉट हैशेबल' का उपयोग नहीं कर सकते हैं:
>>> a = {}
>>> b = ['some', 'list']
>>> hash(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
>>> a[b] = 'some'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
आप हैश टेबल के बारे में अधिक पढ़ सकते हैं या जांच सकते हैं कि यह अजगर में कैसे लागू किया गया है और इसे इस तरह क्यों लागू किया गया है ।
.keys()
करने से चाबियों की एक सूची प्राप्त हो सकती है। एक असली हैश टेबल कीज़ को स्टोर नहीं करेगा, अंतरिक्ष को बचाने के लिए सिर्फ हैश।
हैश () पर टेबल लुकअप की तुलना में पायथन डिक्शनरी में अधिक होना चाहिए। क्रूर प्रयोग से मुझे यह हैश टक्कर मिली :
>>> hash(1.1)
2040142438
>>> hash(4504.1)
2040142438
फिर भी यह शब्दकोष नहीं तोड़ता:
>>> d = { 1.1: 'a', 4504.1: 'b' }
>>> d[1.1]
'a'
>>> d[4504.1]
'b'
मानसिक स्वास्थ्य की जांच:
>>> for k,v in d.items(): print(hash(k))
2040142438
2040142438
संभवतः हैश () से परे एक और देखने का स्तर है जो शब्दकोश कुंजियों के बीच टकराव से बचा जाता है। या हो सकता है तानाशाह () एक अलग हैश का उपयोग करता है।
(वैसे, पाइथन 2.7.10 में यह। पाइथन 3.4.3 और 3.5.0 पर टक्कर के साथ एक ही कहानी hash(1.1) == hash(214748749.8)
)।
hash('I wandered lonely as a cloud, that drifts on high o\'er vales and hills, when all at once, I saw a crowd, a host of golden daffodils.')
यह 19 अंकों का दशमलव देता है - -4037225020714749784
अगर आप देखभाल करने के लिए पर्याप्त हैं। अपने खुद के शब्दों में जारी रखें, बच्चों, और हैश अभी भी एक 19-अंकीय संख्या है। मुझे लगता है कि पायथन में हैश की लंबाई की एक सीमा हो सकती है, लेकिन संभावित मानों की तुलना में कई अधिक संभावित तारों को कहने के लिए सुरक्षित है। और hash(False)
= 0 वैसे।
हाँ। आंतरिक रूप से इसे Z / 2 ( स्रोत ) पर एक आदिम बहुपद के आधार पर खुले हैशिंग के रूप में लागू किया जाता है ।
नोस्क्लो के स्पष्टीकरण पर विस्तार करने के लिए:
a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[tuple(b)] = 'some' # this will, same as a['some', 'list']
dict
कार्यान्वयन के आंतरिक मामलों से संबंधित है।