2016-07-04 4 views
35

दो चर अजगर में है एक ही id:दो चर एक ही आईडी है, लेकिन नहीं सूचियों या tuples

a = 10 
b = 10 
a is b 
>>> True 

अगर मैं दो list रों ले: this link Senderle के अनुसार

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

जवाब दिया कि अपरिवर्तनीय ऑब्जेक्ट संदर्भों में एक ही आईडी है और सूचियों जैसे म्यूटेबल ऑब्जेक्ट्स में अलग-अलग आईडी हैं।

तो अब उसके जवाब के अनुसार, tuples एक ही आईडी होना चाहिए - जिसका अर्थ है:

a = (1, 2, 3) 
b = (1, 2, 3) 
a is b 
>>> False 

आदर्श रूप में, के रूप में tuples परिवर्तनशील नहीं हैं, यह True लौटना चाहिए, लेकिन यह False लौट रहा है!

स्पष्टीकरण क्या है?

+0

आप चर और वस्तुओं (सूचियों और tuples) के बीच अंतर करने की है। – dmitryro

+13

मुझे लगता है कि आपने जिस उत्तर से लिंक किया है उसे गलत समझा है। अलग अपरिवर्तनीय वस्तुओं के अलग-अलग आईडी होते हैं। लेकिन पूर्णांक <256 (अधिकांश दुभाषियों पर) के लिए मान स्मृति में पूर्व लोड होता है और इसलिए आपके पहले उदाहरण में बी –

+0

धन्यवाद @ जैक्यूस गौडिन! यह अब मेरे लिए कुछ समझ में आता है। –

उत्तर

44

अपरिवर्तनीय वस्तुओं में id समान नहीं है, और तथ्य के रूप में यह किसी भी प्रकार की वस्तुओं के लिए सच नहीं है जिसे आप अलग से परिभाषित करते हैं। हर बार जब आप पाइथन में किसी ऑब्जेक्ट को परिभाषित करते हैं, तो आप एक नई पहचान के साथ एक नई वस्तु बना देंगे।

लेकिन छोटे पूर्णांक (-5 और 256 के बीच) और छोटे तारों (आंतरिक तारों (आमतौर पर 20 वर्ण से कम) के साथ आंतरिक तारों के लिए कुछ अपवाद हैं जो एकल हैं और id (वास्तव में एक वस्तु है एकाधिक सूचक)। आपको निम्न रूप में इस तथ्य की जांच कर सकते हैं:

>>> 30 is 20 + 10 
True 
>>> 
>>> 300 is 200 + 100 
False 
>>> 'aa' * 2 is 'a' * 4 
True 
>>> 'aa' * 20 is 'a' * 40 
False 

और एक कस्टम वस्तु के लिए:

>>> class A: 
... pass 
... 
>>> A() is A() # Every time you create an instance you'll have a new instance with new identity 
False 

भी ध्यान रखें कि is ऑपरेटर वस्तु की पहचान, नहीं मूल्य की जाँच करेगा। आप == का उपयोग करना चाहिए आप मान की जाँच करना चाहते हैं:

>>> 300 == 3*100 
True 

और के बाद से वहाँ tuples (अन्य प्रकार के) अगर आप किसी भी आकार वे अपने स्वयं के आईडी मिल जाएगा में दो ही tuples को परिभाषित करने के लिए इस तरह का कोई नियम है:

>>> a = (1,) 
>>> b = (1,) 
>>> 
>>> a is b 
False 

और ध्यान दें कि सिंगलटन पूर्णांकों का तथ्य और तार प्रशिक्षु सच है भले ही आप उनमें परिवर्तनशील और अपरिवर्तनीय वस्तुओं के भीतर निर्धारित करें:

>>> a = (100, 700, 400) 
>>> 
>>> b = (100, 700, 400) 
>>> 
>>> a[0] is b[0] 
True 
>>> a[1] is b[1] 
False 
+0

: एक [1] बी [1] सच होना चाहिए, यह गलत क्यों लौटा? –

+4

@ राम आप क्यों सोचते हैं कि इसे सही वापस करना चाहिए, वे 2 अलग-अलग वस्तुएं (पूर्णांक) हैं लेकिन समान मूल्य (आईडी नहीं) के साथ। और ध्यान दें कि वे 256 से कम नहीं हैं। – Kasramvd

+1

हाँ, सहमत हैं। मुझे लगता है कि केवल पूर्णांक <256 आईड्स() सत्य लौटाएगा। पाइथन दुभाषिया में 256 से अधिक किसी भी पूर्णांक की अपनी आईडी स्थान होगी, मान समान होंगे। –

19

अपरिवर्तनीय != एक ही वस्तु।*

An immutable object is simply an object whose state cannot be altered; और यह सब कुछ है। जब कोई नई वस्तु बनाई जाती है, इसे एक नया पता पर सौंपा जाएगा। इस तरह, जांचें कि पते is के बराबर हैं, तो False वापस आ जाएगा।

तथ्य यह है कि 1 is 1 या "a" is "a" रिटर्न True कारण integer caching और स्ट्रिंग interning अजगर द्वारा किया जाता है, तो यह आप भ्रमित न दें है; यह वस्तुओं में म्यूटेबल/अपरिवर्तनीय होने से संबंधित नहीं है।


* खाली अपरिवर्तनीय वस्तुओं do refer to the same object और उनके is सत्ता हालांकि वास्तविक वापसी करता है, यह एक विशेष कार्यान्वयन विशिष्ट मामला है,।

15

इस कोड पर एक नज़र डालें:

>>> a = (1, 2, 3) 
>>> b = (1, 2, 3) 
>>> c = a 
>>> id(a) 
178153080L 
>>> id(b) 
178098040L 
>>> id(c) 
178153080L 

आदेश क्यों a is cTruea is b जबकि पैदावार False मैं दृढ़ता से सुझाव है कि आप में से ऊपर टुकड़ा कदम-दर-कदम को चलाने के लिए के रूप में मूल्यांकन किया जाता है यह पता लगाने के लिए Online Python Tutor। स्मृति में वस्तुओं का आलेखीय प्रतिनिधित्व आपको इस मुद्दे में गहरी अंतर्दृष्टि प्रदान करेगा (मैं एक स्क्रीनशॉट संलग्न कर रहा हूं)। जब आप इस तरह दो वस्तुओं की तुलना आप, उनके स्मृति पतों जो अलग तुलना एक ही सूची और टपल तत्वों होने के बावजूद -

enter image description here

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