2011-01-13 16 views
5

संभव डुप्लिकेट:
Python '==' vs 'is' comparing strings, 'is' fails sometimes, why?अजगर तार का संदर्भ

हाय। मेरे पास एक सवाल है कि पाइथन कैसे काम करता है जब संदर्भ आता है कि कब और कब उपयोग किया जाता है।

मेरे यहां एक उदाहरण है जो मैं समझता हूं।

a = "cat" 
b = a 
a is b 
    True 

यह समझ में आता है। लेकिन यहां कुछ ऐसा आता है जो मुझे समझ में नहीं आता है।

a = "cat" 
b = "cat" 
a is b 
    True 
c = 1.2 
d = 1.2 
c is d 
    False 
e = "cat" 
f = "".join(a) 
e is f 
    False 

क्यों करता है एक वापसी ख सच है और नहीं d है? दोनों प्रकार अपरिवर्तनीय सही हैं? और यह फ्लोट नंबर का उपयोग करते समय काम करता था, मैं केवल कल्पना कर सकता हूं कि यह किसी प्रकार का अनुकूलन है, लेकिन मैं किसी भी उत्तर के लिए खुश हूं।

मैं भी कुछ अन्य बातों की कोशिश की और यह परिणाम मिला:

a = "cat" 
b = "c" 
c = b+"at" 
a is c 
    False # Why not same as setting c = "cat" 
d = "cat"+"" 
a is d 
    True # Probably same as setting d = "cat" 
e = "c"+"at" 
a is e 
    True # Probably same as setting e = "cat" 

मुझे लगता है कि यह यहाँ एक ही समस्या है, लेकिन कारण है कि यह जब चर बनाने के लिए प्रयोग किया जाता है नहीं यह सच है देता है "बिल्ली"?

मैं अजगर 2.5 का उपयोग करता है, तो है कि किसी भी differance

किसी भी सुझाव और उपयोगी विचार यहाँ की सराहना कर रहे हैं होगा।

+0

पायथन 2.6 और मैं दूसरे उदाहरण में 'सी डी डी' के लिए सच हो रहा हूं। –

उत्तर

7
a = "cat" 
b = "cat" 
a is b 
    True 
c = 1.2 
d = 1.2 
c is d 
    False 

क्यों a is b वापसी True और नहीं c is d करता है?

ठीक है, सही सवाल होगा "क्यों c is d वापसी False और नहीं a is b?" के बाद से तार्किक अपेक्षित व्यवहार False वापस जाने के लिए हो सकता है - वे अलग वस्तुओं, अलग-अलग स्थानों में बनाए गए हैं।

बात यह है कि सी, सीप्टन में लिखे गए अजगर का वर्तमान कार्यान्वयन स्ट्रिंग और छोटे इंटेल कैशिंग का उपयोग अनुकूलन के साधन के रूप में करता है। उस अनुकूलन के पीछे तर्क यह है कि, क्योंकि वे वैसे भी अपरिवर्तनीय हैं, इससे कोई फर्क नहीं पड़ता। लेकिन आप उस व्यवहार पर निर्भर नहीं होना चाहिए क्योंकि यह कार्यान्वयन-विशिष्ट है और भाषा का हिस्सा नहीं है। is पर स्ट्रिंग की तुलना करने के लिए हमेशा == का उपयोग करें। == में अपरिवर्तनीय बिल्टिन प्रकारों के लिए एक अनुकूलन भी है, जहां यह पहले पहचान की जांच करता है, और केवल तभी जब वे एक ही वस्तु नहीं हैं, समानता परीक्षण के साथ आगे बढ़ता है। तो यह प्रदर्शन के अनुसार कोई फर्क नहीं पड़ता।

ऐसा लगता है कि आप पहले ही पाए गए हैं कि आप अपने शेष प्रश्न पर, क्यों आप इसे Cpython पर भरोसा नहीं कर सकते हैं।

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