2017-02-21 8 views
9

में अपरिवर्तनीयता मैं यह समझने की कोशिश कर रहा हूं कि पाइथन में अपरिवर्तनीयता कैसे काम करती है। चूंकि स्ट्रिंग पाइथन में अपरिवर्तनीय है, इसलिए मैं प्रत्येक स्ट्रिंग ऑपरेशन करने पर आईडी को बदलने की उम्मीद कर रहा था लेकिन यह अपेक्षा के अनुसार काम नहीं करता है। उदाहरण: टी पर अंतिम ऑपरेशन इसकी आईडी नहीं बदलता है। कोई विचार क्यों?पायथन

Screen shot of the operation

+0

संबंधित: [पाइथन अपरिवर्तनीय स्ट्रिंग की बदलती आईडी के बारे में] (http://stackoverflow.com/questions/24245324/about-the-changing-id-of-a-python-immutable-string) – fredtantini

+1

मैं वास्तव में नफरत है कि यह अनुकूलन पाइथन भाषा अर्थशास्त्र का उल्लंघन कैसे करता है। भाषा अर्थशास्त्र के अनुसार, '+ =' से पहले और बाद में 'टी' के मान अलग-अलग ऑब्जेक्ट्स (मुश्किल से) जीवनकाल को ओवरलैप करने के साथ होना चाहिए, इसलिए उनके लिए 'id' साझा करना असंभव होना चाहिए। – user2357112

उत्तर

5

मैं विभिन्न कोशिकाओं [memory containing variables (I will not go to the bit level)], जिनमें से कुछ खाली [cells containing garbage/empty value] थे में सेब की एक पंक्ति थी।

मैंने एक बाहर निकाला। यह सेल 3 [logical address = 3] में था।

मैंने इसे नीला रंग दिया (जब मैंने इसे अप्रत्याशित प्रदर्शन के लिए भविष्य तकनीक का उपयोग करके क्लोन किया) [committed an operation on it, same could go for addition for integers]

मैंने देखा कि इसे कहां रखा जाए, और हालांकि सेल 4 मुक्त था, सेल 3 भी था (क्योंकि "मूल" सेब अब और नहीं है)! इसलिए मैंने इसे सेल 3 [and although we get a "new" apple, it has the same address] में वापस रखा।


ही अपने t (ध्यान दें कि id CPython में चर की स्मृति पता है) के लिए चला जाता है, लेकिन जब से हम "सेब की चेन" के बारे में यहाँ बात कर रहे हैं (तार एक वर्ण अनुक्रम के बने होते हैं, हमारे पास है हम अनुक्रम में जारी रखने का स्थान की मात्रा पर विचार करना है, तो मेरी स्मृति (_ अंतरिक्ष के लिए मनमाने ढंग से कचरा डेटा के लिए खड़ा है, '^')

H e l l o _ _ _ _ _ B O O M 
^ string pointer points here 

की तरह लग रही है, तो मैं थी और मैं करने के लिए स्ट्रिंग को बदलना चाहते हैं "Hello you", मैं मुक्त स्थान का उपयोग करने पर विचार कर सकता हूं:

H e l l o^y o u _ B O O M 
^ string pointer points here 

लेकिन अगर मैं "Hello world!" को स्ट्रिंग को बदलना चाहते हैं, मैं (हम जो एक कचरा एकत्र वातावरण में संभव है सही "BOOM" के बाद यह हो सकता है, कहीं और "Hello world!" की लंबाई में रिक्त स्थान के लिए देखो करने के लिए होगा, कैसे अपने आईडी अलग है पर) देखो:

H e l l o^y o u _ B O O M _ H e l l o^w o r l d ! _ G A R B A G E 
          ^string pointer points here 
+0

@ बीएम। मुद्दा यह है कि इंटर्निंग की समानता है। मैंने जो लिखा है वह मूल रूप से मार्टिजन की टिप्पणी की तरह है - "पायथन स्मृति स्लॉट का पुन: उपयोग करने के लिए स्वतंत्र है।" – Uriel

+0

@ बीएम।मैं समझ नहीं पा रहा हूं कि इसका मतलब क्या है "यह ऐसा नहीं है [एसआईसी!] इस तरह काम करता है।" यह उत्तर क्या वर्णन कर रहा है यह है कि पायथन एक नई स्ट्रिंग के लिए मेमोरी एड्रेस का पुन: उपयोग कर रहा है क्योंकि पिछली स्ट्रिंग को कचरा इकट्ठा किया गया था। मैंने लिंक को देखा और मैं नहीं देख सकता कि यह प्रश्न में वर्णित घटना के लिए वैकल्पिक व्याख्या कैसे प्रदान करेगा। –

+0

क्षमा करें, यह बहुत प्रत्यक्ष था। मैं समझाने के लिए कुछ पोस्ट करता हूं कि मैं क्या समझता हूं। मुझे लगता है कि इस उदाहरण में, नीले सेब को सेल 3 में नहीं रखा जाता है, आप बस हरे रंग को यहां देते हैं और सेल 3 के अंत में नीले पेंट जोड़ते हैं। –

3

वस्तुओं की आईडी पुन: उपयोग किया जा सकता है, जब तक मूल वस्तु मौजूद नहीं है के रूप में। यह तारों के लिए विशिष्ट नहीं है, लेकिन सभी पायथन प्रकारों के लिए। सबसे सरल उदाहरण के लिए, आप एक सरल object की आईडी की जांच कर सकते हैं:

>>> print id(object()) 
140437485756544 
>>> print id(object()) 
140437485756544 

हालांकि, अगर हम पिछले ऑब्जेक्ट के संदर्भ को बनाए रखने, आईडी पुन: उपयोग नहीं किया जाएगा:

>>> a = object() 
>>> id(a) 
140437485756544 
>>> b = object() 
>>> id(b) 
140437485756560 

आप कर सकते हैं इंटरमीडिएट परिणामों (t में मान) को एक सूची में जोड़कर तारों के साथ अपने परीक्षणों में वही व्यवहार दोहराएं।

+0

आईडी को बदलने के लिए "टेस्ट" को जोड़ने के पहले दो टेस्ट मामलों में क्यों बदलाव आया? क्या यह "यादृच्छिक" है या क्या इस मामले में स्ट्रिंग के लिए पाइथन को स्मृति आवंटित करने का व्यवस्थित तरीका है? – PrestonM

+1

@ प्रेस्टन एम आईडी को पुन: उपयोग करने की गारंटी नहीं है - कुछ और उस स्मृति स्थान को ले सकता है (जिस तरह पहली बार सीपीथन 'आईडी' लागू करता है)। गारंटी दी जाती है कि एक जीवित वस्तु की आईडी बदलती नहीं है, और कोई भी दो विशिष्ट (और लाइव) ऑब्जेक्ट एक ही आईडी साझा नहीं करेगा। – user4815162342

+0

यह सही समझ में आता है। धन्यवाद! – PrestonM