Understanding Python name objects, immutable data, and memory management -


नौसिखिया यहाँ। कहें कि मैं निम्नलिखित करता हूं:

  a = "123" b = a [1] a = "abc"  

मेरी समझ यह है कि:

  • एक कोई स्ट्रिंग ऑब्जेक्ट नहीं है "123" एक स्ट्रिंग ऑब्जेक्ट है (सुनिश्चित नहीं है कि मैं "ऑब्जेक्ट" शब्द का सही उपयोग कर रहा हूं - शायद सिर्फ "डेटा का टुकड़ा" या स्ट्रिंग) उस प्रथम स्टेटमेंट द्वारा बनाई गई जिसमें नाम a असाइन किया गया है।
  • चूंकि यह एक स्ट्रिंग है, "123" अपरिवर्तनीय है
  • b एक नया नाम है जो "123" ऑब्जेक्ट के एक हिस्से को इंगित करता है (अंक - जो कि एक स्ट्रिंग - "2" है)। बी करता है नहीं "123" से कॉपी किए गए डेटा के एक नए टुकड़े को संदर्भित करता है यह एक ही "2" को संदर्भित करता है जिसे a [1]
  • द्वारा निर्दिष्ट किया जाता है। तीसरे बयान में नाम a एक नया, अपरिवर्तनीय स्ट्रिंग के लिए पुराने स्ट्रिंग नहीं बदला है। किसी भी तरह से केवल नाम a बदल दिया गया है
  • अजगर स्वचालित रूप से एकत्र कचरा है, जिसका मतलब है कि यह स्मृति को मुक्त करता है क्योंकि डेटा अब जरूरी नहीं है।

पाइथन स्मृति मॉडल और चर के बारे में पिछली SO चर्चा के लिए देखें

तो अब ऊपर मान लिया जा रहा है कि सही है इस स्थिति के बारे में मेरे पास कुछ सवाल हैं:

  1. चूंकि डेटा जो a [0] ] और a [2] लाइन 3 के बाद अब जरूरी नहीं है, क्या यह एक उम्मीदवार है और / या कचरा एकत्र होने की संभावना है? या, चूंकि b अभी भी "123" के एक हिस्से की बात कर रहा है, क्या पूरी स्ट्रिंग संरक्षित है जब तक कि कोई नाम किसी भी टुकड़े को इंगित नहीं कर रहा है?

    मैं इस बारे में सोच रहा हूँ क्योंकि उदाहरण के लिए यदि आपके पास बहुत बड़ी सूची वस्तु है, और केवल इंगित करने वाले शेष नामों का केवल एक छोटा सा हिस्सा है और कोई भी नाम पूरी बात को इंगित नहीं करता है, यह ऐसा लगता है कि यह स्मृति प्रबंधन के लिए एक बड़ी समस्या बन सकती है

  2. यदि स्ट्रिंग मेमोरी में मौजूद है, जब तक कि उसके किसी भी हिस्से को इंगित करने के लिए कोई नाम न हो, वहाँ स्ट्रिंग के अन्य भागों पर वापस जाने का कोई तरीका है इसके लिए नाम हैं? ऊपर दिए गए उदाहरण में: एक बार जब a को एक नई स्ट्रिंग में दोबारा सौंपा गया है, और b "2" की तरफ इशारा कर रहा है, तो "1" को वापस लाने का एक तरीका है और "3"?

    मैं नहीं पूछ रहा हूँ क्योंकि मैं वास्तव में चाहता हूं ऐसा करने के लिए, यह सिर्फ एक सीखने की कवायद है

टिप्पणियों को संक्षिप्त करने के लिए और एक संरचित व्याख्या दे:

  "123"  

एक स्ट्रिंग ऑब्जेक्ट है और अपरिवर्तनीय है। परिचालन में चार ([x]) स्ट्रिंग ऑब्जेक्ट पर पायथन एक पत्र की प्रतिलिपि वापस करता है। एक अक्षर भी एक स्ट्रिंग है आपके पास अब 2 स्वतंत्र स्ट्रिंग ऑब्जेक्ट्स हैं "123" और

  a = "123" b = a [1]  

"2" । चूंकि b एक स्वतंत्र स्ट्रिंग ऑब्जेक्ट को सौंपा गया है, a को बदलने से b पर कोई असर नहीं होगा। यदि आप फिर से असाइन करते हैं, तो आपके स्ट्रिंग ऑब्जेक्ट "123" खो जाएंगे और "1" और "3" को फिर से जीवित करने का कोई तरीका नहीं है, लेकिन आप शायद पहले से ही जानते हैं।

सूची वस्तु अलग तरह से काम करती है।


Comments