चूंकि लोग यहां टिप्पणियों में और दो अन्य प्रश्नों के रूप में चिह्नित किए गए हैं, जो सभी के लिए एक ही तरीके से इस बारे में भ्रमित दिखाई देते हैं, मुझे लगता है कि यह एलेक्स कॉवेंट्री के शीर्ष पर एक अतिरिक्त जवाब जोड़ने के लायक है ।
तथ्य यह है कि एलेक्स एक सूची की तरह, एक उत्परिवर्तित प्रकार का मूल्य प्रदान कर रहा है, इसका कोई लेना-देना नहीं है कि चीजें साझा की जाती हैं या नहीं। हम इसे id
फंक्शन या is
ऑपरेटर के साथ देख सकते हैं :
>>> class A: foo = object()
>>> a, b = A(), A()
>>> a.foo is b.foo
True
>>> class A:
... def __init__(self): self.foo = object()
>>> a, b = A(), A()
>>> a.foo is b.foo
False
(यदि आप सोच रहे हैं कि मैंने object()
इसके बजाय इसका उपयोग क्यों किया , तो कहना चाहिए 5
कि दो अन्य मुद्दों पर चलने से बचना चाहिए, जिन्हें मैं यहाँ नहीं करना चाहता; दो अलग-अलग कारणों से, पूरी तरह से अलग-अलग बनाये 5
जा सकते हैं। संख्या का एक ही उदाहरण 5
। लेकिन पूरी तरह से अलग-अलग बनाया object()
नहीं जा सकता।)
तो, ऐसा क्यों है कि a.foo.append(5)
एलेक्स का उदाहरण प्रभावित करता है b.foo
, लेकिन a.foo = 5
मेरे उदाहरण में नहीं है? खैर, a.foo = 5
एलेक्स के उदाहरण में प्रयास करें , और ध्यान दें कि यह b.foo
वहाँ भी प्रभावित नहीं करता है ।
a.foo = 5
सिर्फ a.foo
नाम के लिए बना रहा है 5
। यह प्रभावित नहीं करता है b.foo
, या पुराने मूल्य के लिए किसी भी अन्य नाम का a.foo
उपयोग करता है। * यह थोड़ा मुश्किल है कि हम एक उदाहरण विशेषता बना रहे हैं जो एक वर्ग विशेषता को छुपाता है, ** लेकिन एक बार जब आप इसे प्राप्त करते हैं, तो कुछ भी जटिल नहीं है यहाँ हो रहा है।
उम्मीद है कि अब यह स्पष्ट है कि एलेक्स ने एक सूची का उपयोग क्यों किया: तथ्य यह है कि आप एक सूची को बदल सकते हैं इसका मतलब यह दिखाना आसान है कि दो चर एक ही सूची को नाम देते हैं, और इसका अर्थ यह भी है कि वास्तविक-जीवन संहिता में यह जानना महत्वपूर्ण है कि आपके पास दो सूचियाँ हैं या नहीं एक ही सूची के दो नाम।
* C ++ जैसी भाषा से आने वाले लोगों के लिए भ्रम यह है कि पायथन में, मूल्यों को चर में संग्रहीत नहीं किया जाता है। मूल्य मूल्य-भूमि में रहते हैं, अपने दम पर, चर केवल मूल्यों के लिए नाम हैं, और असाइनमेंट सिर्फ एक नया नाम मान के लिए बनाता है। यदि यह मदद करता है, तो एक के shared_ptr<T>
बजाय प्रत्येक पायथन चर के बारे में सोचें T
।
** कुछ लोग एक उदाहरण विशेषता के लिए "डिफ़ॉल्ट मान" के रूप में एक वर्ग विशेषता का उपयोग करके इसका लाभ उठाते हैं जो उदाहरण सेट हो सकते हैं या नहीं हो सकते हैं। यह कुछ मामलों में उपयोगी हो सकता है, लेकिन यह भ्रामक भी हो सकता है, इसलिए इसके साथ सावधान रहें।