2012-03-24 13 views
10

चलें कहते हैं कि तुम एक सेट है:सेट पॉपिंग (अजगर)

foo = {1, 2, 3, 4, 5} 

पुस्तक मैं वर्तमान में पढ़ रहा हूँ, प्रो अजगर में, यह कहना है कि foo.pop() का उपयोग कर कि चयन से एक मनमाना संख्या पॉप करेगा। लेकिन ... जब मैं इसे आज़माता हूं, तो यह pops 1, then 2, then 3... क्या यह मनमाने ढंग से करता है, या यह सिर्फ एक संयोग है?

+0

इस हैश समारोह है कि एक सेट यह स्मृति में स्थानों के लिए सामग्री है मैप करने के लिए उपयोग करता है के साथ क्या करना है। विभिन्न डेटा प्रकारों पर 'हैश() 'करने का प्रयास करें और देखें कि आपको कौन सी संख्याएं मिलती हैं। एक सेट _will_ से बाहर निकला हुआ arbritrary संख्या सेट में _next_ तत्व हो। ऐसा ही होता है कि डेटा को सेट करने वाला "आदेश" डेटा को तब तक आदेशित नहीं किया जा सकता है जब तक आप चिंतित हों। इस उदाहरण में, आदेश है कि तत्व हैशैप को संग्रहीत/पुनर्प्राप्त करने के क्रम के साथ मेल खाता है। –

+0

मुझे आज भी वही चीज़ मिली और मैं आपका प्रश्न उठाना चाहता हूं –

उत्तर

16

कारण यह कहता है कि यह मनमाने ढंग से है क्योंकि गारंटी देने के बारे में कोई जानकारी नहीं है। चूंकि आपने अभी सेट बनाया है, यह तत्वों को "अच्छा" ऑर्डर में संग्रहीत कर सकता है, और इस प्रकार .pop() उस क्रम में उन्हें वापस करने के लिए होता है, लेकिन यदि आप सेट को म्यूट करना चाहते हैं, तो हो सकता है कि यह जारी न रहे।

उदाहरण:

>>> foo = set() 
>>> foo.add(-3) 
>>> foo.add(-1) 
>>> foo.add(2) 
>>> foo.pop() 
2 
>>> foo.pop() 
-3 
14

सेट और शब्दकोशों हैश तालिकाओं का उपयोग लागू होते हैं। वे अनियंत्रित संग्रह हैं, जिसका अर्थ है कि उनके पास कोई गारंटीकृत आदेश नहीं है।

जो ऑर्डर आप देख रहे हैं वह एक गैर-गारंटीकृत कार्यान्वयन विवरण है। कार्यान्वयन विस्तार पूर्णांकों का कारण बनता है

>>> [hash(i) for i in range(10)] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

जो आपके सेट के आदेश दिए प्रस्तुत की जाएगी: CPython में, एक पूर्णांक के लिए हैश मान पूर्णांक ही है। अन्य सेट अर्ध-आदेशित होंगे, {5, 6, 7, 8, 9}set([8, 9, 5, 6, 7]) के रूप में प्रकट होता है।

इसके विपरीत, अन्य डेटाटाइप जैसे str में विभिन्न हैश फ़ंक्शन हैं और अधिक स्कैम्बल दिखाई देंगे। उदाहरण के लिए:

# Example of scrambling str objects in a 64-bit build 
>>> {'red', 'green', 'blue'} 
set(['blue', 'green', 'red']) 

set.pop विधि प्रविष्टियों बाएँ-से-सही बंद दिखाई नहीं देता। यह एक गैर-गारंटीकृत कार्यान्वयन विस्तार भी है।

आपके प्रश्न का संक्षिप्त उत्तर हाँ है, ऑर्डरिंग मनमानी है लेकिन नहीं, जो आपने देखा वह सिर्फ एक संयोग नहीं था, बल्कि यह एक दिलचस्प गैर-गारंटीकृत कार्यान्वयन विस्तार था।

आशा इस को साफ करता है-अप आप के लिए रहस्य :-)

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