एक और डुप्लिकेट पूछ रहा था कि दो समान तार आम तौर पर समान क्यों नहीं हैं, जो वास्तव में यहां उत्तर नहीं दिया गया है:
>>> x = 'a'
>>> x += 'bc'
>>> y = 'abc'
>>> x == y
True
>>> x is y
False
तो, वे एक ही स्ट्रिंग क्यों नहीं हैं? विशेष रूप से यह दिया:
>>> z = 'abc'
>>> w = 'abc'
>>> z is w
True
चलो दूसरे भाग को थोड़ा सा हटा दें। पहला सच कैसे हो सकता है?
दुभाषिया के पास एक "इंटर्निंग टेबल" होना चाहिए, स्ट्रिंग ऑब्जेक्ट्स के लिए एक टेबल मैपिंग स्ट्रिंग मान, इसलिए हर बार जब आप सामग्री के साथ एक नया स्ट्रिंग बनाने की कोशिश करते हैं 'abc'
, तो आपको उसी ऑब्जेक्ट को वापस मिलता है। इंटर्नशिप कैसे काम करती है, इस पर विकिपीडिया में अधिक विस्तृत चर्चा है।
और पायथन में एक स्ट्रिंग इंटर्निंग टेबल है; आप sys.intern
विधि के साथ मैन्युअल रूप से स्ट्रिंग्स को इंटर्न कर सकते हैं ।
वास्तव में, पायथन को किसी भी अपरिवर्तनीय प्रकार को स्वचालित रूप से इंटर्न करने की अनुमति है, लेकिन ऐसा करने की आवश्यकता नहीं है। अलग-अलग कार्यान्वयन अलग-अलग मूल्यों को आंतरिक करेंगे।
CPython (आप जिस कार्यान्वयन का उपयोग कर रहे हैं यदि आप नहीं जानते हैं कि आप किस कार्यान्वयन का उपयोग कर रहे हैं) तो ऑटो-इंटर्न्स छोटे पूर्णांक और कुछ विशेष एकल जैसे False
, लेकिन तार नहीं (या बड़े पूर्णांक, या छोटे ट्यूपल, या कुछ और)। आप इसे बहुत आसानी से देख सकते हैं:
>>> a = 0
>>> a += 1
>>> b = 1
>>> a is b
True
>>> a = False
>>> a = not a
>>> b = True
a is b
True
>>> a = 1000
>>> a += 1
>>> b = 1001
>>> a is b
False
ठीक है, लेकिन समान z
और w
समान क्यों थे ?
यह दुभाषिया स्वचालित रूप से इंटर्निंग नहीं है, यह संकलक तह मान है।
एक ही संकलन समय स्ट्रिंग एक ही मॉड्यूल में दो बार प्रकट होता है (वास्तव में क्या यह मतलब है परिभाषित-यह करने के लिए, एक स्ट्रिंग शाब्दिक रूप में एक ही बात नहीं है क्योंकि कठिन है r'abc'
, 'abc'
और 'a' 'b' 'c'
सभी विभिन्न शाब्दिक लेकिन एक ही कर रहे हैं स्ट्रिंग-लेकिन आसान समझने के लिए सहज ज्ञान युक्त), संकलक केवल दो संदर्भों के साथ, स्ट्रिंग का एक उदाहरण बनाएगा।
वास्तव में, कंपाइलर आगे भी 'ab' + 'c'
जा सकता है : 'abc'
ऑप्टिमाइज़र द्वारा परिवर्तित किया जा सकता है , जिस स्थिति में इसे एक 'abc'
ही मॉड्यूल में एक स्थिर के साथ एक साथ मोड़ा जा सकता है ।
फिर, यह कुछ ऐसा है जिसे अजगर की अनुमति है लेकिन करने की आवश्यकता नहीं है। लेकिन इस मामले में, सीपीथॉन हमेशा छोटे तार (और भी, उदाहरण के लिए, छोटे ट्यूपल्स) को मोड़ता है। (हालांकि इंटरएक्टिव इंटरप्रेटर का स्टेटमेंट-बाय-स्टेट कंपाइलर मॉड्यूल-ए-ए-टाइम कंपाइलर के समान ऑप्टिमाइज़ेशन नहीं चलाता है, इसलिए आप इंटरएक्टिव परिणाम बिल्कुल नहीं देखेंगे।)
तो, एक प्रोग्रामर के रूप में आपको इसके बारे में क्या करना चाहिए?
कुछ नहीं। यदि आपके पास दो अपरिवर्तनीय मूल्य समान हैं, तो आपके पास देखभाल करने का कोई कारण नहीं है। यदि आप जानना चाहते हैं कि आप a is b
इसके स्थान पर कब उपयोग कर सकते हैं a == b
, तो आप गलत प्रश्न पूछ रहे हैं। बस हमेशा a == b
दो मामलों को छोड़कर उपयोग करें :
- अधिक पठनीय तुलना के लिए सिंगलटन मान जैसे
x is None
।
- परिवर्तनशील मूल्यों के लिए, जब आपको यह जानना
x
होगा कि क्या उत्परिवर्तन प्रभावित करेगा y
।