2017-01-24 21 views
9

एक अजगर इंटरैक्टिव सत्र में जब:पाइथन इंटरेक्टिव मोड में तारों को इंटर्न नहीं कर रहा है?

In [1]: a = "my string" 

In [2]: b = "my string" 

In [3]: a == b 
Out[3]: True 

In [4]: a is b 
Out[4]: False 

In [5]: import sys 

In [6]: print(sys.version) 
3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] 

दूसरी ओर, जब निम्न कार्यक्रम चलाने:

#!/usr/bin/env python 

import sys 


def test(): 
    a = "my string" 
    b = "my string" 
    print(a == b) 
    print(a is b) 


if __name__ == "__main__": 
    test() 
    print(sys.version) 

उत्पादन होता है:

True 
True 
3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] 

क्यों a is b अलग परिणाम है उपर्युक्त दो मामलों में?

मैं this जवाब के बारे में पता कर रहा हूँ (और निश्चित रूप से == और is ऑपरेटरों के बीच का अंतर! सवाल! की बात यह है कि), लेकिन नहीं कर रहे हैं a और b पहले मामले में एक ही वस्तु भी? (इंटरपेटर?) क्योंकि वे एक ही (अपरिवर्तनीय) स्ट्रिंग को इंगित करते हैं?

+1

संभावित डुप्लिकेट [क्या Python में \ '== \' और \ 'है \" के बीच कोई अंतर है? (Http://stackoverflow.com/questions/132988/is-there-a-difference-between -और-इन-इन-पायथन) – Juggernaut

+1

आपको cpython स्रोत कोड की जांच करनी होगी, लेकिन मुझे लगता है कि पाइथन दुभाषिया यह समझने के लिए पर्याप्त स्मार्ट है कि दोनों तार एक जैसे हैं और चूंकि तार अपरिवर्तनीय हैं एक ही उदाहरण के लिए दोनों चर इंगित करें। इसलिए एक 'चेक' चेक सही है। आरईपीएल के लिए तारों में वृद्धि होती है क्योंकि इस तरह के अनुकूलन अवसर नहीं होते हैं और दोनों चर विभिन्न वस्तुओं को संदर्भित करते हैं। –

+4

@AminEtesamian जो मैं समझता हूं उससे सवाल यह है कि दुभाषिया का उपयोग करते समय आईडी अलग क्यों होती है लेकिन एक .py फ़ाइल चलाते समय समान होती है। मुझे लगता है कि पकारमोल है और == के बीच का अंतर समझता है। – HolyDanna

उत्तर

8

यह string interning के कारण होता है। एक और उदाहरण के लिए this question देखें।

आपके उदाहरण में, सीपीथन मॉड्यूल में स्ट्रिंग स्थिरांक को इंटर्न करता है लेकिन आरईपीएल में नहीं है।

+2

अधिक जानकारी के लिए [यह] (http://stackoverflow.com/a/25267946/2076832) उत्तर देखें। – GRAYgoose124

+1

सुधार। यह गलती पर स्ट्रिंग इंटर्निंग नहीं है।यह निरंतर तहखाने के साथ करना है। [यहां] देखें (https://paste.pound-python.org/show/1lMKJxdj7mgR3doK98XS/) – GRAYgoose124

+0

@ GRAYgoose124 सही है, कोड ऑब्जेक्ट्स उनके स्थिरांक को समर्पित करते हैं। साथ ही, उदाहरण स्ट्रिंग में एक स्थान होता है और डिफ़ॉल्ट रूप से इंटर्न नहीं किया जाता है। कृपया एक उत्तर लिखें, मैं अपना मिटा दूंगा। – emulbreh

1

तो दो स्ट्रिंग बनाते समय कंसोल दो अलग-अलग ऑब्जेक्ट बनाता है, लेकिन दुभाषिया, एक ही फ़ंक्शन में कोड चलाते समय समान तारों के स्मृति स्थान का पुन: उपयोग करेगा। यहाँ अगर यह आप के लिए हो रहा है को देखने का तरीका है:

a = "my string" 
b = "my string" 

print id(a) 
print id(b) 

इन दो आईडी एक ही हैं, तो a is bTrue वापस आ जाएगी, नहीं करता है, तो फिर यह False

वापस आ जाएगी ऐसा लगता है कि एनाकोंडा उपयोग कर रहे हैं , इसलिए मैंने इसे कंसोल में चेक किया और विभिन्न आईडी पाया और फिर संपादक में एक फ़ंक्शन लिखा और इसे निष्पादित किया और उसी आईडी को मिला।

नोट: अब हम जानते हैं कि कि is निर्धारित करता है दो चर लेबल स्मृति में एक ही वस्तु को इंगित करता है, तो, मैं कहना चाहिए कि is किफ़ायत से इस्तेमाल किया जाना चाहिए। इसका उपयोग आम तौर पर सिंगल a is None जैसे सिंगलेट्स की तुलना करने के लिए किया जाता है, उदाहरण के लिए। तो वस्तुओं का तुलना करने के लिए इसका उपयोग न करें, == का उपयोग करें, और कक्षाएं बनाते समय __eq__ विधि लागू करें ताकि आप == ऑपरेटर का उपयोग कर सकें।

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