python - अजगर स्क्रिप्ट और अजगर निष्क्रिय में अलग व्यवहार?



python-2.7 cpython (1)

जब पायथन एक स्क्रिप्ट फ़ाइल निष्पादित करता है, तो पूरी फ़ाइल को पहले पार्स किया जाता है। आप नोटिस कर सकते हैं कि जब आप किसी वाक्य रचना त्रुटि को कहीं से जोड़ते हैं: भले ही यह कहां से हो, यह किसी पंक्ति को निष्पादित करने से रोक देगा।

इसलिए जब से पायथन पहले फ़ाइल को पार्स करता है, तो शब्दशः स्मृति में प्रभावी ढंग से लोड किया जा सकता है। चूंकि अजगर जानता है कि ये स्थिर हैं, सभी चर जो कि निरंतर मान का प्रतिनिधित्व करते हैं, स्मृति में समान ऑब्जेक्ट को इंगित कर सकते हैं। तो वस्तु साझा की जाती है।

यह ints और floats के लिए काम करता है, लेकिन यहां तक ​​कि तार के लिए; यहां तक ​​कि जब एक निरंतर अभिव्यक्ति होती है जिसे पहले मूल्यांकन किया जाना चाहिए:

a = "foo"
b = "foo"
c = "fo" + "o"
print(a is b)
print(a is c)

अब आईडीएलई में, व्यवहार बहुत अलग है: एक इंटरैक्टिव दुभाषिया के रूप में, आईडीई प्रत्येक लाइन को अलग से निष्पादित करता है। तो a = 1.1 और b = 1.1 को अलग-अलग संदर्भों में निष्पादित किया जाता है जो इसे असंभव (या सिर्फ बहुत कठिन) बनाता है यह समझने के लिए कि वे दोनों एक ही स्थिर शाब्दिक मूल्य को साझा करते हैं और स्मृति को साझा कर सकते हैं तो इसके बजाय, दुभाषिया दो अलग-अलग ऑब्जेक्ट्स को आवंटित करेगा, जिसके कारण पहचान की जाँच का कारण विफल हो जाता है।

छोटे पूर्णांक के लिए, स्थिति थोड़ा अलग है क्योंकि वे अक्सर उपयोग किया जाता है, CPython स्थिरांक का एक सेट (-5 और 256 के बीच की सीमा में) को स्थिर रूप से संग्रहीत करता है और इन बिंदुओं के प्रत्येक मूल्य को उसी int वस्तु के लिए बनाता है यही कारण है कि आप किसी अन्य ऑब्जेक्ट की तुलना में छोटे पूर्णांक के लिए एक अलग परिणाम प्राप्त करते हैं। निम्न प्रश्न भी देखें:

अजगर निष्क्रिय में:

>>> a=1.1
>>> b=1.1
>>> a is b
False

लेकिन जब मैंने कोड को एक स्क्रिप्ट में डाल दिया और इसे चलाया, मुझे एक अलग परिणाम मिल जाएगा:

$cat t.py
a=1.1
b=1.1
print a is b
$python t.py
True

ऐसा क्यों हुआ? मुझे पता है कि दो ऑब्जेक्ट्स के id की तुलना की जाती है, इसलिए दो ऑब्जेक्ट की आईडी अजैड स्क्रिप्ट / बेकार में समान / अद्वितीय क्यों हैं?

मुझे यह भी पता चला है कि, यदि मैं एक छोटा सा इंटेल का उपयोग करता हूं, उदाहरण 1 , 1 बजाय, परिणाम दोनों अजगर स्क्रिप्ट और अजगर निष्क्रिय में होगा। छोटे इंट और छोटे नाव में अलग व्यवहार क्यों किया?

मैं CPython 2.7.5 का उपयोग कर रहा हूँ।





cpython