2016-05-03 9 views
7

मैं बस के बारे में पढ़ रहा था जो -5 के बीच क्योंकि अजगर कैश नंबर और 256पायथन: अलग-अलग परिणाम जब PyCharm और निष्क्रिय/अजगर

होता है 'अप्रत्याशित परिणाम ऑपरेटर है की' का उपयोग कर यह यहाँ पर चर्चा की गई: "is" operator behaves unexpectedly with integers

और यहाँ: "is" and "id" in Python 3.5

जब मैं वहाँ दिए गए उदाहरणों में से एक चलाने के लिए, मैं अजगर निष्क्रिय और अजगर आईडीई (- 5.0.4 मैं JetBrains Pycharm पेशेवर संस्करण का उपयोग कर रहा है) के बीच अलग-अलग परिणाम मिलता है।

अजगर निष्क्रिय का उपयोग करते समय यह परिणाम है:

a = 1000 
b = 1000 
print (a is b) # prints False 

Pycharm 5.0.4 का उपयोग कर इस परिणाम है जब:

a = 1000 
b = 1000 
print (a is b) # prints True 

यह कैसे हो सकता है? मैंने दोबारा जांच की है, और मेरे प्रोजेक्ट के पायथन-इंटरप्रेटर दोनों मामलों में बिल्कुल समान है (दोनों पाइथन 3.5.1 हैं)। सुनिश्चित नहीं है कि यह कुछ है जो मैंने गलत किया है, और मैं उम्मीद कर रहा था कि कोई इसे समझा सकता है।

संपादित करें:

मैं जानता हूँ कि 'एक' 'बी' == सच iff आईडी (क) == आईडी (ख), और आप इसे आप में से कुछ की तरह देख सकते हैं कि टिप्पणी में उल्लेख किया है । शायद मुझे और स्पष्ट होना चाहिए था, जो मुझे समझ में नहीं आता है यह कैसे हो सकता है कि एक आईडीई का अलग व्यवहार हो? मैंने सोचा (और कृपया, मुझे सही करें, जैसा कि ऐसा लगता है कि मैं गलत हूं) कि एक आईडीई सिर्फ उपयोगकर्ता के अनुकूल वातावरण है जो बाहरी कंपाइलर्स/दुभाषियों का उपयोग करता है, और यही कारण है कि ये उन आईडीई से स्वतंत्र हैं (उदाहरण के लिए, पिचर्म समर्थन करता है न केवल अजगर, और मैं सी संकलक के साथ ग्रहण चला सकते हैं, या जावा आदि (जो सभी आईडीई के कुछ हिस्सों नहीं हैं)

धन्यवाद, is operator के लिए एलन

उत्तर

4

इसका कारण यह है कि कैसे LOAD_CONST बाइट कोड काम करता है:

ढेर पर co_consts[consti] धकेलती है।

के बाद से पूर्णांकों स्थिरांक के रूप में जमा हो जाती है तो उसी संदर्भ में ठीक उसी परिणाम निकलेगा में एक ही पूर्णांक तक कार्य, हम देख सकते हैं कि LOAD_CONST को तर्क दोनों ए और बी के लिए 0 है:

>>> import dis 
>>> dis.dis("a = 1000 ; b = 1000")  
    1   0 LOAD_CONST    0 (1000) 
       3 STORE_NAME    0 (a) 
       6 LOAD_CONST    0 (1000) 
       9 STORE_NAME    1 (b) 
      12 LOAD_CONST    1 (None) 
      15 RETURN_VALUE 
             #^this is the argument 

जहां के रूप में एक इंटरैक्टिव सत्र में प्रत्येक आदेश अलग से संकलित किया गया है (ताकि वे अलग से क्रियान्वित किया जा सकता) तो स्थिरांक अलग होगा:

>>> code1 = compile("a = 1000","<dummy file>","exec") 
>>> code2 = compile("a = 1000","<dummy file>","exec") 
>>> code1.co_consts, code2.co_consts 
((1000, None), (1000, None)) 
>>> code1.co_consts[0] is code2.co_consts[0] 
False 

एक समारोह में इसी प्रकार निरंतर हमेशा एक जैसी रहेगी, लेकिन यह अन्य कार्यों में लगातार करने के लिए अलग हो जाएगा:

def f(): 
    return 1000 
def g(): 
    return 1000 #different code object!! 

#these all work 
assert f() is f() 
assert g() is g() 
assert f() is not g() 
assert f() is not 1000 and g() is not 1000 

भी ध्यान रखें कि @AniMenon रूप से -5 256 नंबर बताया गया है अनुकूलन के लिए एकमात्र हैं तो वह उस सीमा में संख्याओं के लिए सच नहीं होगा।

+0

धन्यवाद! यही वह याद आ रहा था। – Alonbs

3

प्रलेखन से:।।

ऑपरेटर is और is not ऑब्जेक्ट पहचान के लिए परीक्षण: x is y है सही यदि और केवल तभी एक्स और वाई एक ही वस्तु हैं।

>>> a = 1000 
>>> b = 1000 
>>> print (a is b) 
False 
>>> 
>>> 
>>> id(a) 
35334812 
>>> id(b) 
35334800 

PyCharm:

अब जांच निष्क्रिय करने देता

>>> a = 1000 
b = 1000 
print (a is b) 
True 
>>> id(a) 
36079236 
>>> id(b) 
36079236 

PyCharm में दोनों a और b जब निष्क्रिय में ऐसा नहीं होता ही वस्तुओं हैं।

अब क्या PyCharm में instersting, कि अगर आप निष्क्रिय में की तरह, लाइन द्वारा अपने कोड लाइन में प्रवेश, आप निष्क्रिय में के रूप में एक ही परिणाम मिलेगा:

>>> a = 1000 
>>> b = 1000 
>>> print (a is b) 
False 

मेरा अनुमान है, कि

>>> a = 1000 
    b = 1000 

के लिए अनुकूलित है:

>>> a = b = 1000 
>>> print (a is b) 
True 

तो इसलिए आप a के लिए एक ही वस्तु मिला और b

+1

आपका अनुमान 'a = 1000 जैसी चीज़ों के साथ परीक्षण करके समर्थित किया जा सकता है; बी = 100 + 900' या अन्य ऑपरेशंस जो पूर्णांक 1000 में परिणामस्वरूप होते हैं। इस तरह, मुझे उसी ऑब्जेक्ट को संदर्भित करने के लिए अनुकूलित नहीं किया जाना चाहिए, मुझे लगता है। –

+0

हाँ, मुझे आईडी() फ़ंक्शन के बारे में पता है, लेकिन यह काफी नहीं है जो मैं पूछ रहा था। कृपया मेरा अपडेट देखें। और बिना जवाब के जवाब के लिए धन्यवाद। – Alonbs

+0

यह ऑप्टिमाइज़ेशन के कारण है, लेकिन 'ए = 1000 के बाद से आपने जो कुछ सोचा था, उतना नहीं; बी = कोई नहीं; सी = 1000' भी 'सी है' सत्य बनाता है, आप [मेरा जवाब] देखना चाहते हैं (http://stackoverflow.com/a/37104846/5827215) –

0

isTrue अगर दो चर एक ही वस्तु को इंगित वापस आ जाएगी, ==True अगर वस्तुओं चर बराबर हैं से जाना जाता वापस आ जाएगी।

अजगर में,

>>> a = [1, 2, 3] 
>>> b = a 
>>> b is a 
True 
>>> b == a 
True 

>>> b = a[:] 
>>> b is a 
False 
>>> b == a 
True 

है ऐसा इसलिए है क्योंकि हम आईडी (क) आईडी (ख) के लिए मिलान कर रहे हैं।

पर विचार करें,

a = 1000 
b = 1000 
a is b 

a is b झूठी हो सकता है; पहचान के बारे में आपकी धारणा केवल -5 to 256 समेत सीमाओं के लिए सीपीथॉन में होती है, जो प्रदर्शन कारणों के लिए सिंगलेट हैं, लेकिन अन्य सभी चींटियों को आवश्यकतानुसार पुनर्निर्मित नहीं किया जाता है, सिंगलटन नहीं।

के आधार पर: reference