Another duplicate पूछ क्यों दो बराबर तार आम तौर पर, समान नहीं हैं जो वास्तव में यहाँ का उत्तर नहीं मिला था:
>>> x = 'a'
>>> x += 'bc'
>>> y = 'abc'
>>> x == y
True
>>> x is y
False
तो, वे एक ही स्ट्रिंग क्यों नहीं हैं? खास तौर पर इस दी:
>>> z = 'abc'
>>> w = 'abc'
>>> z is w
True
के एक बिट के लिए दूसरे भाग बंद कर दिया करते हैं। पहला व्यक्ति कैसे सच हो सकता है?
दुभाषिया को स्ट्रिंग ऑब्जेक्ट्स के लिए एक टेबल मैपिंग स्ट्रिंग मान, "इंटर्निंग टेबल" होना चाहिए, इसलिए हर बार जब आप 'abc'
सामग्री के साथ एक नई स्ट्रिंग बनाने का प्रयास करते हैं, तो आप एक ही ऑब्जेक्ट वापस लेते हैं। Wikipedia में इंटर्निंग कैसे काम करता है इस पर एक और विस्तृत चर्चा है।
और पायथन में एक स्ट्रिंग इंटर्निंग टेबल है; आप sys.intern
विधि के साथ मैन्युअल रूप से प्रशिक्षु तार कर सकते हैं।
वास्तव में, अजगर अनुमति लिए स्वचालित रूप से प्रशिक्षु किसी भी अपरिवर्तनीय प्रकार है, लेकिन ऐसा करने के लिए नहीं की आवश्यकता है। विभिन्न कार्यान्वयन अलग-अलग मूल्यों को प्रशिक्षित करेंगे।
सीपीथॉन (यदि आप नहीं जानते हैं कि आप किस कार्यान्वयन का उपयोग कर रहे हैं तो कार्यान्वयन का उपयोग कर रहे हैं) ऑटो इंटर्न छोटे इंटीग्रर्स और 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'
सभी विभिन्न शाब्दिक हैं, लेकिन मुश्किल है एक ही स्ट्रिंग-लेकिन intuitively समझने में आसान), संकलक केवल दो संदर्भों के साथ स्ट्रिंग का एक उदाहरण बना दिया जाएगा और।
वास्तव में, संकलक भी आगे जा सकते हैं: 'ab' + 'c'
अनुकूलक, जो मामले में यह एक ही मॉड्यूल में एक 'abc'
निरंतर के साथ एक साथ तह किया जा सकता द्वारा 'abc'
में बदला जा सकता।
फिर, यह कुछ है जो पाइथन की अनुमति है लेकिन ऐसा करने की आवश्यकता नहीं है। लेकिन इस मामले में, सीपीथन हमेशा छोटे तारों को जोड़ता है (और, उदाहरण के लिए, छोटे tuples)। (हालांकि इंटरैक्टिव दुभाषिया के बयान-दर-बयान संकलक मॉड्यूल-एट-एक-टाइम संकलक के रूप में ही अनुकूलन नहीं चलता है, तो आप वास्तव में एक ही परिणाम सहभागी नहीं देख सकेंगे।)
तो , प्रोग्रामर के रूप में आप इसके बारे में क्या करना चाहिए?
अच्छा ... कुछ भी नहीं। यदि आपके दो अपरिवर्तनीय मूल्य समान हैं तो आपके पास देखभाल करने का कोई कारण नहीं है। यदि आप जानना चाहते हैं कि a == b
के बजाय आप a is b
का उपयोग कब कर सकते हैं, तो आप गलत सवाल पूछ रहे हैं। अधिक पठनीय तुलना के लिए सिंगलटन मूल्यों के x is None
तरह
- : बस हमेशा
a == b
दो मामलों को छोड़कर का उपयोग करें।
- परिवर्तनीय मूल्यों के लिए, जब आपको यह जानने की आवश्यकता है कि
x
पर उत्परिवर्तन y
को प्रभावित करेगा या नहीं।
संबंधित प्रश्न http://stackoverflow.com/questions/38189660/two-variables-in-python-have-same-id-but-not-lists-or-tuples-why/38189759#38189759 – Kasramvd