2012-10-03 7 views
5

संभव डुप्लिकेट:
String comparison in Python: is vs. ==
Python string interning
Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?पायथन: क्यों ऑपरेटर "है" और "==" कभी-कभी तारों के लिए अंतर-परिवर्तनीय होते हैं?

मैंने गलती is और == स्ट्रिंग्स के लिए भी किया जाता है, लेकिन मैं हमेशा एक ही नहीं है की खोज की।

>>> Folder = "locales/" 
>>> Folder2 = "locales/" 
>>> Folder is Folder2 
False 
>>> Folder == Folder2 
True 
>>> File = "file" 
>>> File2 = "file" 
>>> File is File2 
True 
>>> File == File2 
True 
>>> 

क्यों एक केस ऑपरेटर एक दूसरे के बदले में हैं और दूसरे में नहीं?

+0

अब इस आदत से हट जाओ है! 'Is' के साथ स्ट्रिंग की तुलना विश्वसनीय नहीं है, और पाइथन प्लेटफ़ॉर्म (सीपीथन/ज्योथन/आयरन पायथन) में गैर-पोर्टेबल है। '==' के साथ तारों की तुलना करें। सिंगलेट्स (जैसे 'कोई नहीं') या अपनी खुद की सृजन की वस्तुओं के साथ पहचान तुलना के लिए 'is' सहेजें। क्या आप इनट्स की तुलना करने के लिए 'is' का उपयोग करते हैं? यह उतना ही अविश्वसनीय है। – PaulMcG

+0

@PaulMcGuire मैंने इसका उपयोग नहीं किया लेकिन दुर्घटना से इसकी खोज की। और फिर कोशिश की और उपरोक्त असंगतता की खोज की। –

+1

अन्य प्रासंगिक प्रश्न जिन्हें डुप्लिक लक्ष्य माना जा सकता है: [या तो '==' या 'is' का उपयोग करके पायथन में स्ट्रिंग की तुलना करना कभी-कभी एक अलग परिणाम उत्पन्न करता है?] (Http://stackoverflow.com/q/1504717) और [ पायथन स्ट्रिंग इंटर्निंग] (http://stackoverflow.com/q/15541404) –

उत्तर

12

लघु तारों को दक्षता के लिए प्रशिक्षित किया जाता है, इसलिए उसी वस्तु को संदर्भित किया जाएगा इसलिए is सत्य होगा।

यह सीपीथन में एक कार्यान्वयन विस्तार है, और पूरी तरह से भरोसा नहीं किया जाना चाहिए।

+0

दिलचस्प पायथन ट्रिविया: आप किसी भी दिए गए स्ट्रिंग को इंटर्न() कॉल के साथ प्रशिक्षित कर सकते हैं। –

3

== ऑपरेटर पहले ऑब्जेक्ट की आंतरिक __cmp__() विधि को कॉल करता है जो इसे दूसरे की तुलना करता है। यह तारों सहित सभी पायथन वस्तुओं के लिए सच है। is ऑपरेटर ऑब्जेक्ट्स पहचान की तुलना करता है:

प्रत्येक ऑब्जेक्ट में एक पहचान, एक प्रकार और मान होता है। एक बार वस्तु बनने के बाद किसी ऑब्जेक्ट की पहचान कभी नहीं बदली जाती है; आप इसे स्मृति में ऑब्जेक्ट का पता के रूप में सोच सकते हैं। 'है' ऑपरेटर दो वस्तुओं की पहचान की तुलना करता है; आईडी() फ़ंक्शन एक पूर्णांक देता है जो इसकी पहचान का प्रतिनिधित्व करता है (वर्तमान में इसके पते के रूप में लागू किया गया है)।

उदाहरण के लिए:

s1 = 'abc' 
id(s1) 
>>> 140058541968080 
s2 = 'abc' 
id(s2) 
>>> 140058541968080 

# The values the same due to SPECIFIC CPython behvaiour which detects 
# that the value exists in interpreter's memory thus there is no need 
# to store it twice. 

s1 is s2 
>>> True 

s2 = 'cde' 
id(s2) 
>>> 140058541968040 
s1 is s2 
>>> False  
4

यह सवाल उस पर और अधिक प्रकाश डालता है: String comparison in Python: is vs. ==

संक्षिप्त उत्तर है: समान मूल्य के लिए == परीक्षण जहां बराबर पहचान के लिए (वस्तु संदर्भ के माध्यम से is परीक्षण)।

तथ्य समान मूल्य के साथ 2 तार बराबर पहचान पता चलता है अजगर दुभाषिया के अनुकूलन है, के रूप में डैनियल Roseman की पुष्टि करता है :)

संबंधित मुद्दे