2015-03-05 5 views
8

क्यों एक कॉलन के उपयोग के परिणाम को फर्क पड़ता है पड़ता है? और सही परिणाम क्या होना चाहिए?अजगर अर्धविराम एक फर्क

# Not stored in a different location. 
>>> id('123 4')== id('123 4') 
True 

# Also returns true 
>>> x = '123 4'; y ='123 4'; id(x) == id(y) 
True 

लेकिन यह वही चीज़ झूठी वापसी करती है।

>>> x = '123 4' 
>>> y = '123 4' 
>>> id(x) == id(y) 
False 

समारोह के तहत यही बात रिटर्न यह सच है

>>> def test(): 
...  x = '123 4';y='123 4'; print (id(x)==id(y)) 
...  a = '123 4' 
...  b='123 4' 
...  print (id(a)==id(b)) 
... 
>>> test() 
True 
True 
+1

करता लाइन एक्स = '123 4'; वाई = '123 4'; आईडी (x) == आईडी (y) ही चरण में निष्पादित, यही कारण है कि यह सच लौट आए है? –

+2

@ 61612 मुझे यह उल्लिखित प्रश्न का डुप्लिकेट नहीं लगता है। सवाल यह है कि, जब आप न्यूलाइन और अर्धविराम का उपयोग कथन विभाजक के रूप में करते हैं तो तारों को प्रशिक्षित करने के नियम अलग-अलग होते हैं। – luk32

+1

नहीं, मैंने डुप्लिकेट के रूप में नहीं सोचा था। मैं अजगर में अर्ध कोलन का उपयोग करके विभिन्न परिणाम के बारे में चिंतित हूं। –

उत्तर

8
>>> x="123 4";y="123 4" 

अजगर बहुत चालाक दोनों चर एक ही मूल्य मिल (क्योंकि वे एक ही पंक्ति में व्याख्या कर रहे हैं) और इतने भंडार पहचान करने के लिए है कि मूल्य एक ही स्मृति स्थान में (जो id(x) == id(y) है)।

हालांकि

>>> x="123 4" 
>>> y="123 4" 

अजगर नहीं बहुत चालाक साकार करने के लिए वे दोनों एक ही मान रहे हैं (क्योंकि वे अलग पंक्ति में व्याख्या कर रहे हैं) और है तो दुकानों का अपना स्मृति स्थान में प्रत्येक (अर्थात, id(x) != id(y) है)।

+4

इस कहीं निर्दिष्ट है, या इस जादुई और गैर-दस्तावेजी व्यवहार किसी तरह का है कि किसी अजगर दुभाषिया में जोड़ने के लिए अपने रास्ते से बाहर गया है? – ArtOfWarfare

+1

के बाद से अजगर लाइन द्वारा लाइन को पार्स करता है यह बता सकते हैं ... सी/C++ यह संकलक द्वारा बाहर अनुकूलित किया जाएगा ... यदि आप 'किया y = x' तो यह आईडी साझा करेंगे ... इसके सिर्फ सामान्य कैसे में अजगर स्मृति आवंटित करता है ... अजगर के सभी खुला स्रोत है ... और मैं सुनिश्चित करें कि आप वास्तविक प्रलेखन कहीं पा सकते हैं –

+0

(शायद एकमात्र स्रोत को देखकर) मुझे लगता है कि स्ट्रिंग नजरबंदी होता है जब स्ट्रिंग पार्स किया गया है। दुभाषिया में, यह लाइन से लाइन है। दूर लेना अपरिभाषित व्यवहार पर भरोसा नहीं है! – tdelaney

4

यह सिर्फ कैसे दुभाषिया लिखा है की एक दुर्घटना है। एक स्क्रिप्ट में एक ही चीज़ करना एक अलग परिणाम दिखाता है। यह मुझे लगता है जैसे स्ट्रिंग इंटर्नमेंट संकलन इकाइयों के साथ होता है।

(जोड़ा stuff2.py कई मॉड्यूल को दिखाने के लिए)

stuff2.py:

z = '123 4' 

stuff.py:

x = '123 4';y='123 4';print id(x)==id(y) 
x = '123 4' 
y='123 4' 
print id(x)==id(y) 
import stuff2 
print id(x)==id(stuff2.z) 


$ python stuff.py 
True 
True 
False 
+0

यह मेरे लिए विचित्र लगता है - एक स्क्रिप्ट के भीतर ऐसा क्यों करना होगा दुभाषिया के भीतर ऐसा करने से अलग व्यवहार होता है? इसका मतलब है कि कोई ऑप्टिमाइज़ेशन लिखने के अपने रास्ते से बाहर निकल गया है जो केवल दुभाषिया के भीतर ही किया जाता है। – ArtOfWarfare

+3

मैं इसे इस तरह से नहीं देखता हूं। ऐसा लगता है कि स्ट्रिंग इंटर्नमेंट स्टफ एक पार्सिंग एक्शन में चलती है, जो दुभाषिया में अलग है जो छोटे टुकड़ों पर चल रही है और पूरी फाइल पर चल रही एक स्क्रिप्ट निष्पादन है। एक और दिलचस्प परीक्षण कई मॉड्यूल में क्या होगा। मुझे लगता है कि मैं इसे जोड़ दूंगा। – tdelaney

+0

आह मेरे उत्तर से बेहतर है (मुझे नहीं पता था कि यह इंटरैक्टिव चलाने के लिए विशिष्ट था) (मेरे द्वारा +1) –

0

ठीक है, के रूप में यह स्पष्ट है, इस से संबंधित है Python में इंटर्निंग स्ट्रिंग करने के लिए। यह तंत्र कार्यान्वयन-निर्भर है, इसलिए किसी भी पायथन दुभाषिया जैसे CPython, IronPython, PyPy, आदि अलग-अलग व्यवहार कर सकते हैं। और यह संस्करणों के बीच बदल सकता है। यह शायद रनों के बीच भी बदल सकता है।

अपने विशिष्ट मामले को हल करने के एक अपने दुभाषिया के दिए गए संस्करण के स्रोत कोड का विश्लेषण करने की आवश्यकता होगी। और सबसे अच्छी शर्त यह है कि एक पंक्ति में पारित बयानों को संभालने के कार्यान्वयन में एक मामूली अंतर होता है (अर्धविराम से अलग) और उन्हें एक-एक करके निष्पादित करना।

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

0

आप चर के साथ-साथ एक ही स्थान पर मूल्य अंक अजगर में एक चर के लिए एक अपरिवर्तनीय वस्तु असाइन करते हैं,

>>> a = 5 
>>> b = 5 
>>> id(5) 
11372376 
>>> id(a) 
11372376 
>>> id(b) 
11372376 
>>> a == b 
True 
>>> a is b 
True 

आईडी तुलना बिल्कुल काम करेंगे के रूप में आप ID मान देख सकते हैं। अब अजगर चर के परिवर्तनशील वस्तुओं आवंटित करने के लिए कोशिश कर सकते हैं।

>>> x = '123 4' 
>>> y = '123 4' 
>>> x == y 
True 
>>> x is y 
False 
>>> id(x) 
21598832 
>>> id(y) 
21599408 
>>> id('123 4') 
21599312 

आप यहां आईडी अंतर देख सकते हैं। जैसा कि 'है' पता स्थान वाले मानों की तुलना करता है जहां '==' संदर्भ मान के साथ सीधे तुलना करता है।हालांकि यह अपरिवर्तनीय वस्तुओं के मामले में एक ही स्थान पर सभी बिंदुओं के मामले में कोई त्रुटि नहीं देता है, लेकिन विस्थापन के मामले में मान बदल सकते हैं क्योंकि वेरिएबल्स वर्तमान वस्तु की ओर इशारा करते हैं और इसलिए आपको झूठा परिणाम मिल जाता है।

आशा इस मदद करता है :)

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