आप फ्रेम और वातावरण के बीच सूक्ष्म अंतर से फिसल किया जा रहा है (जो फ्रेम के वातावरण के बाद भी और अधिक सूक्ष्म, या शायद वातावरण फ्रेम हैं) और lexical and dynamic scoping के बीच का अंतर। सहायता पृष्ठ में parent.frame
और अन्य स्थानों पर विभिन्न विवरणों में फैले कुछ विवरण हैं।
कोशिश करते हैं और आसान बनाने के लिए:
आपका getter
कार्य है अपने स्वयं के environment जहां कि कार्य करने के लिए स्थानीय चर जमा हो जाती है (x
इस मामले में)। चूंकि आर को अक्षय रूप से स्कॉप्ड किया गया है जिसका अर्थ है कि कार्य वातावरण में एक अभिभावक वातावरण होता है जिसे परिभाषित किया जाता है कि कार्य कहां परिभाषित किया गया है, इस मामले में वैश्विक वातावरण (यदि इसे किसी अन्य कार्य के अंदर परिभाषित किया गया था तो माता-पिता पर्यावरण उस के लिए env होगा समारोह)।
जब आप f1
फोन और यह getter
तो गेटर चर foo
, यह पहली अपने परिवेश से लग रहा है खोजने की कोशिश करता कहता है, वहाँ यह नहीं मिल रहा है, तो अपनी मूल वातावरण जिसमें वैश्विक env है और साथ foo
पाता में लग रहा है 1.
का मूल्य आपकी सोच गतिशील स्कॉइंग की रेखाओं के साथ जाती है, जो फ्रेम अनुमानित है। जब f1
कहा जाता है तो इसे अपना पर्यावरण प्राप्त होता है (जिसके भीतर foo
को मान 2 असाइन किया जाएगा), तो यह getter
फ़ंक्शन को कॉल करता है। foo
का वातावरण getter
के env (शाब्दिक scoping) की मूल नहीं है, लेकिन f1
का वातावरण getter
के बाद से f1
से बुलाया गया था getter
की मूल फ्रेम है, इसलिए f1
के वातावरण में देखने के लिए आप get
बताने की आवश्यकता पैरेंट वातावरण की बजाय पैरेंट फ्रेम में देखने के लिए कार्य करें।
इसका सारांश यह है कि अभिभावक पर्यावरण वह वातावरण है जहां एक फ़ंक्शन परिभाषित किया गया था (लेक्सिकल स्कॉइंग), पैरेंट फ्रेम वह फ्रेम/वातावरण है जहां से फ़ंक्शन को कॉल किया गया था (नकली गतिशील स्कोपिंग)।
स्रोत
2012-09-19 17:11:02
ऐसा हुआ, धन्यवाद! यह क्यों है कि parent.frame() काम करता है लेकिन sys.parent() नहीं? क्या कोई ऐसा दस्तावेज है जो चर्चा करता है कि ये सभी अलग-अलग कार्य कैसे काम करते हैं, और संख्या या नाम से पर्यावरण का जिक्र करने के बीच अंतर? – hgcrpd
@hgcrpd 'sys.parent' फ्रेम/पर्यावरण नहीं, एक पूर्णांक देता है। 'parent.frame' फ्रेम प्राप्त करने के लिए' sys.parent' जानकारी के साथ 'sys.parent' जानकारी का उपयोग करता है (न केवल इसके पूर्णांक मान)। –