जवाबों:
यह एक उत्कृष्ट प्रश्न है।
मुख्य अंतर्दृष्टि यह है कि ट्यूपल्स को यह जानने का कोई तरीका नहीं है कि उनके अंदर की वस्तुएं परस्पर हैं या नहीं। केवल एक चीज जो एक वस्तु को परिवर्तनशील बनाती है, वह है एक विधि जो उसके डेटा को बदल देती है। सामान्य तौर पर, इसका पता लगाने का कोई तरीका नहीं है।
एक और अंतर्दृष्टि यह है कि पायथन के कंटेनरों में वास्तव में कुछ भी नहीं है। इसके बजाय, वे अन्य वस्तुओं का संदर्भ रखते हैं। इसी तरह, पायथन के चर संकलित भाषाओं में चर की तरह नहीं हैं; इसके बजाय चर नाम सिर्फ एक नेमस्पेस शब्दकोश में चाबियाँ हैं जहां वे एक संबंधित वस्तु के साथ जुड़े हुए हैं। नेड बैचैल्ड ने अपने ब्लॉग पोस्ट में इसे अच्छी तरह से समझाया है । किसी भी तरह से, वस्तुओं को केवल उनकी संदर्भ संख्या पता है; वे नहीं जानते कि वे संदर्भ क्या हैं (चर, कंटेनर, या पायथन इंटर्नल्स)।
साथ में, ये दो अंतर्दृष्टि आपके रहस्य की व्याख्या करती हैं (एक अपरिवर्तनीय टपल "जिसमें" एक सूची में परिवर्तन होता है जब अंतर्निहित सूची बदलती है)। वास्तव में, टपल नहीं बदला (यह अभी भी अन्य वस्तुओं के समान संदर्भ है जो उसने पहले किया था)। ट्यूपल बदल नहीं सकता था (क्योंकि इसमें उत्परिवर्तन विधियाँ नहीं थीं)। जब सूची में परिवर्तन हुआ, तो टपल को परिवर्तन के बारे में सूचित नहीं किया गया था (सूची को यह नहीं पता है कि क्या यह एक चर, ट्यूपल या किसी अन्य सूची द्वारा संदर्भित है)।
जब हम विषय पर होते हैं, तो आपके मानसिक मॉडल को पूरा करने में मदद करने के लिए यहां कुछ अन्य विचार दिए गए हैं कि वे क्या काम करते हैं, वे कैसे काम करते हैं, और उनका उपयोग करें:
ट्यूपल्स को उनकी अपरिवर्तनीयता से कम और उनके इच्छित उद्देश्य से अधिक दिखाया जाता है।
ट्यूपल्स एक छत के नीचे जानकारी के विषम टुकड़ों को इकट्ठा करने का पायथन का तरीका है। उदाहरण के लिए,
s = ('www.python.org', 80)
एक साथ एक स्ट्रिंग और एक संख्या लाता है ताकि मेजबान / पोर्ट जोड़ी को सॉकेट, एक समग्र वस्तु के रूप में चारों ओर पारित किया जा सके। उस प्रकाश में देखा गया, यह परिवर्तनशील घटकों के लिए पूरी तरह से उचित है।
अपरिवर्तनीयता एक अन्य संपत्ति, हैशबिलिटी के साथ हाथ से हाथ जाती है । लेकिन हैशबिलिटी एक पूर्ण संपत्ति नहीं है। यदि टपल के अवयवों में से कोई भी हैशेबल नहीं है, तो समग्र टपल को भी नहीं धो सकते हैं। उदाहरण के लिए, t = ('red', [10, 20, 30])
हैशेबल नहीं है।
अंतिम उदाहरण में एक 2-ट्यूपल दिखाया गया है जिसमें एक स्ट्रिंग और एक सूची है। टपल अपने आप में परिवर्तनशील नहीं है (अर्थात इसकी सामग्री बदलने के लिए कोई भी तरीका नहीं है)। इसी तरह, स्ट्रिंग अपरिवर्तनीय है क्योंकि स्ट्रिंग्स में कोई उत्परिवर्तन विधियां नहीं हैं। सूची ऑब्जेक्ट में उत्परिवर्तन विधियाँ होती हैं, इसलिए इसे बदला जा सकता है। इससे पता चलता है कि उत्परिवर्तन एक वस्तु प्रकार की संपत्ति है - कुछ वस्तुओं में उत्परिवर्तन विधियां होती हैं और कुछ नहीं। यह सिर्फ इसलिए नहीं बदलता है क्योंकि ऑब्जेक्ट्स नेस्टेड हैं।
दो बातें याद रखें। सबसे पहले, अपरिवर्तनशीलता जादू नहीं है - यह केवल उत्परिवर्तन विधियों की अनुपस्थिति है। दूसरा, वस्तुओं को यह नहीं पता है कि चर या कंटेनर उनका क्या उल्लेख करते हैं - वे केवल संदर्भ संख्या जानते हैं।
आशा है, यह आपके लिए उपयोगी था :-)
hash()
क्योंकि ऑब्जेक्ट () से विरासत में मिली हर चीज हैशनेट होती है और इसलिए सबक्लासेस को हैशिंग को टर्न-ऑफ करने की जरूरत होती है। 2) हैशबिलिटी अपरिवर्तनीयता की गारंटी नहीं देती है - यह उन हैशेबल ऑब्जेक्ट्स के उदाहरणों को बनाना आसान है जो म्यूटेबल हैं। 3) ट्यूपल्स, पाइथन के अधिकांश कंटेनरों की तरह, बस अंतर्निहित वस्तु के संदर्भ हैं - वे उनका निरीक्षण करने और उनके बारे में अनुमान लगाने के लिए कोई कर्तव्य नहीं हैं।
ऐसा इसलिए है क्योंकि के tuples नहीं है सूचियों, तार या नंबर हैं। उनमें अन्य वस्तुओं के संदर्भ हैं । 1 संदर्भ के अनुक्रम को बदलने में असमर्थता में एक टपल शामिल है इसका मतलब यह नहीं है कि आप उन संदर्भों से जुड़ी वस्तुओं को म्यूट नहीं कर सकते हैं। 2
1. वस्तुएं, मूल्य और प्रकार (देखें: दूसरे से अंतिम पैराग्राफ तक)
2. मानक प्रकार पदानुक्रम (देखें: "अपरिवर्तनीय")
सबसे पहले, "अपरिवर्तनीय" शब्द का अर्थ विभिन्न लोगों के लिए कई अलग-अलग चीजें हो सकती हैं। मुझे विशेष रूप से पसंद है कि कैसे एरिक लिपर्ट ने अपने ब्लॉग पोस्ट में अपरिवर्तनीयता को वर्गीकृत किया । वहाँ, वह इस प्रकार की अपरिवर्तनीयता को सूचीबद्ध करता है:
इन्हें विभिन्न प्रकारों में संयोजित किया जा सकता है ताकि अधिक प्रकार की अपरिवर्तनीयता बनाई जा सके, और मुझे यकीन है कि अधिक मौजूद है। जिस प्रकार की अपरिवर्तनशीलता आपको गहरी (जिसे संक्रमणीय भी कहा जाता है) अपरिवर्तनीयता में रूचि लगती है, जिसमें अपरिवर्तनीय वस्तुओं में केवल अन्य अपरिवर्तनीय वस्तुएँ हो सकती हैं।
इसका मुख्य बिंदु यह है कि गहरी अपरिवर्तनीयता केवल एक, कई प्रकार की अपरिवर्तनीयता में से एक है। आप जब भी चाहें अपनी पसंद को अपना सकते हैं, जब तक आप जानते हैं कि "अपरिवर्तनीय" की आपकी धारणा संभवतः किसी और की "अपरिवर्तनीय" की धारणा से भिन्न होती है।
जैसा कि मैं इसे समझता हूं, इस सवाल को डिजाइन निर्णयों के बारे में एक प्रश्न के रूप में फिर से परिभाषित करने की आवश्यकता है: पायथन के डिजाइनरों ने एक अपरिवर्तनीय अनुक्रम प्रकार बनाने का चयन क्यों किया, जिसमें उत्परिवर्तनीय वस्तुएं हो सकती हैं?
इस सवाल का जवाब करने के लिए, हम के बारे में उद्देश्य बारे में सोचना है tuples की सेवा: वे के रूप में काम तेजी से , सामान्य प्रयोजन दृश्यों। इस बात को ध्यान में रखते हुए, यह काफी स्पष्ट हो जाता है कि ट्यूपल्स अपरिवर्तनीय क्यों हैं, लेकिन उनमें परिवर्तनशील वस्तुएं हो सकती हैं। अर्थात:
Tuples तेज़ और मेमोरी कुशल हैं: Tuples सूचियों के मुकाबले बनाने में तेज़ हैं क्योंकि वे अपरिवर्तनीय हैं। अचल स्थिति का मतलब है कि tuples स्थिरांक के रूप में बनाया जा सकता है और इस तरह के रूप भरी हुई, का उपयोग करते हुए निरंतर तह । इसका मतलब यह भी है कि वे तेजी से और अधिक मेमोरी बनाने के लिए कुशल हैं क्योंकि समग्रता की कोई आवश्यकता नहीं है, आदि। वे रैंडम आइटम एक्सेस के लिए सूचियों की तुलना में थोड़ा धीमा हैं , लेकिन अनपैकिंग के लिए फिर से तेज (कम से कम मेरी मशीन पर)। यदि टुपल्स उत्परिवर्तित होते हैं, तो वे इन जैसे उद्देश्यों के लिए तेज़ नहीं होंगे।
ट्यूपल्स सामान्य उद्देश्य हैं : ट्यूपल्स को किसी भी प्रकार की वस्तु को समाहित करने में सक्षम होना चाहिए। वे (जल्दी से) चर-लंबाई तर्क सूचियों ( *
फ़ंक्शन परिभाषाओं में ऑपरेटर के माध्यम से) जैसी चीजों का उपयोग करते हैं । यदि टुप्लस उत्परिवर्तित वस्तुओं को धारण नहीं कर सकते हैं, तो वे इस तरह की चीजों के लिए बेकार होंगे। पायथन को सूचियों का उपयोग करना होगा, जो संभवतः चीजों को धीमा कर देगा, और निश्चित रूप से कम स्मृति कुशल होगा।
तो आप देखते हैं, अपने उद्देश्य को पूरा करने के लिए, टुपल्स को अपरिवर्तनीय होना चाहिए, लेकिन साथ ही साथ उत्परिवर्तनीय वस्तुओं को भी सक्षम करना चाहिए। यदि पायथन के डिजाइनर एक अपरिवर्तनीय वस्तु बनाना चाहते थे जो यह गारंटी देता है कि सभी वस्तुएं जिनमें "शामिल हैं" भी अपरिवर्तनीय हैं, उन्हें एक तीसरा अनुक्रम प्रकार बनाना होगा। लाभ अतिरिक्त जटिलता के लायक नहीं है।
आप id
इसके आइटम नहीं बदल सकते । इसलिए इसमें हमेशा समान आइटम होंगे।
$ python
>>> t = (1, [2, 3])
>>> id(t[1])
12371368
>>> t[1].append(4)
>>> id(t[1])
12371368
मैं यहां एक अंग पर जाऊंगा और कहूंगा कि यहां प्रासंगिक हिस्सा यह है कि जब आप किसी सूची की सामग्री, या किसी वस्तु की स्थिति को बदल सकते हैं, जो एक गुच्छे में निहित है, तो आप जो नहीं बदल सकते हैं वह यह है कि वस्तु या सूची है यदि आपके पास कुछ ऐसा था जो चीज़ पर निर्भर था [3] एक सूची होने के बावजूद, भले ही खाली हो, तो मैं इसे उपयोगी होते हुए देख सकता था।
एक कारण यह है कि एक उत्परिवर्ती प्रकार को अपरिवर्तनीय में परिवर्तित करने के लिए पायथन में कोई सामान्य तरीका नहीं है (अस्वीकार किए गए PEP 351 देखें , और इसे अस्वीकार क्यों किया गया था, इसके लिए लिंक की गई चर्चा )। इस प्रकार, यदि यह प्रतिबंध किसी भी उपयोगकर्ता द्वारा बनाई गई गैर-धुलाई योग्य वस्तु सहित है, तो ट्यूपल्स में विभिन्न प्रकार की वस्तुओं को रखना असंभव होगा।
केवल यही कारण है कि शब्दकोशों और सेटों में यह प्रतिबंध है कि उन्हें वस्तुओं को धोने योग्य बनाने की आवश्यकता होती है, क्योंकि वे आंतरिक रूप से हैड टेबल के रूप में कार्यान्वित किए जाते हैं। लेकिन ध्यान दें कि, विडंबना यह शब्दकोशों और खुद को सेट कर रहे हैं नहीं अपरिवर्तनीय (या hashable)। ट्यूपल्स किसी ऑब्जेक्ट के हैश का उपयोग नहीं करते हैं, इसलिए इसकी उत्परिवर्तन कोई फर्क नहीं पड़ता है।