इसलिए मैंने पाइथन में एक कस्टम क्लास बनाई है जो __iter__
विधि का उपयोग करके पुनरावृत्ति का समर्थन करता है। कक्षा के उदाहरण में प्रत्येक मान देने के लिए __iter__
विधि जनरेटर ऑब्जेक्ट के रूप में संरचित है, yield
का उपयोग करके।मेरी कक्षा के उदाहरण पर इटर() को कॉल करना अपने वर्तमान मूल्यों का 'स्नैपशॉट' नहीं बनाता है?
मैं अगर मैं x = iter(my_instance)
कुछ ऐसा कहना और फिर मेरी उदाहरण में संग्रहीत डेटा को संपादित, अगर मैं बाद में x
के बाहर एक सूची का निर्माण, मैं पाएंगे कि उस सूची मूल्यों my_class
वर्तमान में है कि होता है, बल्कि खोजने कर रहा हूँ जब मैंने iter()
कहा था, तो उसके मानों की तुलना में।
तो मेरे सवाल इस बिंदु पर दो गुना है। सबसे पहले, क्या ऐसा होना चाहिए? यदि हां, तो ऐसा क्यों काम करता है?
ऊपर मुख्य बात है, लेकिन यदि आप वास्तव में ऊपर और परे जाना चाहते हैं, तो पढ़ना जारी रखें। अब मैं इस सवाल से पूछ रहा हूं कि मुझे इस कक्षा को विश्वविद्यालय में असाइनमेंट के रूप में बनाना है। मेरे प्रोफेसर ने एक ऐसा कार्यक्रम प्रदान किया है जो मैंने इस वर्ग पर परीक्षणों का एक गुच्छा चलाया है ताकि मुझे यह पता चल सके कि मैंने इसे पहली बार सही तरीके से किया है या नहीं।
मेरे कार्यक्रम पिछले एक है, जो मूल रूप से क्या ऊपर वर्णित है करता है को छोड़कर हर एक की जांच से गुजर रहा है। समस्या यह है कि यह सूची iter(my_object)
करने के लिए एक पिछले कॉल से बनाया गया है कि समय है कि iter()
उस पर बुलाया गया था पर my_object
में संग्रहीत केवल मूल्यों को प्रतिबिंबित करने की उम्मीद है।
इस पर देखने के बाद मेरे आरंभिक प्रतिक्रिया है कि मेरे प्रोफेसर एक परिणाम बस list(my_object)
बुला के समान प्राप्त करने का इरादा था, लेकिन मैं छात्र यहाँ हूँ, इसलिए यह संभावना बढ़ मैं बस कुछ बहुत ही अजीब में मेरी __iter__
विधि कोडित लगता है रास्ता, जो इस व्यवहार का कारण बन रहा है। या पाइथन ने हाल ही में iter()
फ़ंक्शन कैसे काम किया है?
मैं के बाद से यह एक वर्ग के लिए है मेरी कोड पोस्ट करने के लिए नहीं, पसंद करते हैं, और कहा कि तकनीकी रूप से (मुझे पता है कि बेवकूफ और बेकार, खेद है) धोखा दे माना जा सकता है। हालांकि, मैं विनिर्देश को जोड़ सकता हूं, जो सही here (विशेष रूप से भाग 1, Bag
वर्ग) है।
आपका इटरेटर और आपकी कक्षा भंडारण के लिए समान अंतर्निहित सूची वस्तु का उपयोग कर रही है। यही कारण है कि जब आप डेटा संशोधित करते हैं तो उनमें से दोनों एक बदलाव देखेंगे। – Nayuki
यदि आप इटरेटर को "फ्रीज" करना चाहते हैं, तो आप इसे स्पष्ट रूप से किसी सूची (या कुछ अन्य उपभोग डेटा प्रकार) में परिवर्तित कर सकते हैं। इटरेटर आम तौर पर आलसी होते हैं, जो बताते हैं कि आपके पास वर्णित व्यवहार क्यों है। –
जब म्यूटेबल ऑब्जेक्ट्स (और आपका थैला म्यूटेबल है) पर फिर से चल रहा है, तो मानक लाइब्रेरी से इटेटर भी वही व्यवहार प्रदर्शित करेंगे: वे संशोधनों को प्रतिबिंबित करते हुए वर्तमान स्थिति में पुनरावर्तनीय पर काम करेंगे। – Cyb3rFly3r