2013-06-16 9 views
12

के लिए वही मान जहां तक ​​मुझे पता है, सब कुछ पाइथन में है और आईडी() चाहिए (क्या मैं सही हूँ?) प्रत्येक ऑब्जेक्ट के लिए एक अलग संख्या लौटाएं।आईडी (फ्लोट)

मेरे मामले में, id(1) रिटर्न 4298178968, id(2) रिटर्न 4298178944 लेकिन मैं सभी नाव प्रकार के लिए एक ही मान मिलता है, id(1.1) रिटर्न 4298189032, id(2.2) भी रिटर्न 4298189032 और अधिक।

मुझे सभी फ्लोट मानों के लिए आईडी क्यों मिलता है?

उत्तर

18

पायथन स्मृति पदों का पुन: उपयोग कर सकते हैं।

जब आप चलाएँ:

id(1.1) 

आप, एक नाव मूल्य बनाने इसकी id() के लिए पूछना, और उसके बाद अजगर फिर मूल्य को हटा देता है क्योंकि कुछ भी नहीं करने के लिए संदर्भित करता है। जब आप तो एक और नाव मूल्य बनाने, अजगर एक ही स्मृति स्थिति का पुन: उपयोग कर सकते हैं और इस प्रकार id(2.2)id() के लिए समान मान की संभावना है:

>>> id(1.1) 
140550721129024 
>>> id(2.2) 
140550721129024 

बजाय यह करें:

float_one, float_two = 1.1, 2.2 
print id(float_one), id(float_two) 

अब फ्लोट मानों में उनके संदर्भ (दो चर) हैं और इन्हें नष्ट नहीं किया जाएगा, और अब उनके पास अलग-अलग मेमोरी स्थितियां हैं और इस प्रकार id() मान हैं।

छोटे पूर्णांक (-5 से 256 तक) के लिए अलग-अलग id() मानों को देखने का कारण यह है क्योंकि these values are interned; पायथन केवल एक1 पूर्णांक ऑब्जेक्ट बनाता है और इसे बार-बार उपयोग करता है। नतीजतन, इन पूर्णांकों में सभी का एक अद्वितीय स्मृति पता होता है, क्योंकि पाइथन दुभाषिया स्वयं ही उन्हें संदर्भित करता है, और जब तक दुभाषिया बाहर निकलता है तब तक उन्हें हटा नहीं देगा।

+0

आह हाँ, मैं IPython जहां में था संख्याओं को बाहर रखा जाता है! :) –

+0

धन्यवाद @MartijnPieters। – ehsandotnet

+0

ध्यान दें कि छोटे पूर्णांक का यह इंटर्निंग शायद भाषा की गारंटीकृत संपत्ति के बजाय CPython _implementation_ की एक विशेषता है। इस मामले में, यह कुछ उद्देश्य-सी कार्यान्वयन में छोटे एनएसआईएनटेगर मूल्यों (स्मृति से 12 से 12) के समान है जहां लोगों ने अजीब बनाए रखने के बारे में सोचा है। और, इस तरह, शायद इस इंटर्निंग पर भरोसा करना अच्छा विचार नहीं है। – paxdiablo

4
>>> id(1.1) 
154154684 

1,1 के रूप में किसी भी चर को सौंपा नहीं गया था तो यह कचरा एकत्र किया जाता है और अगली बार एक ही आईडी एक नाव के लिए इस्तेमाल किया जा रहा है:

>>> id(2.2) 
154154684 

1,1 बचाने एक चर में:

>>> f = 1.1 
>>> id(f) 
154154684 #this id is locked for now 

अब नया पता प्रयोग किया जाता है:

>>> id(1.1) 
154154700 
>>> id(2.2) 
154154700 

यह पूर्णांकों रूप में अच्छी तरह लागू होता है:

>>> id(260) 
154302180 
>>> id(280) 
154302180 

पूर्णांकों -5 से 256 को वास्तव में अजगर में कैश कर रहे हैं, इसलिए वे हमेशा भिन्न आईडी वापस जाने के लिए जा रहे हैं।("is" operator behaves unexpectedly with integers)

तार के लिए:

पूर्णांकों कुछ तार भी अजगर में कैश कर रहे हैं जैसा

। तो, इस तरह के तार के id (: 'is' operator behaves differently when comparing strings with spaces विवरण पढ़ने के लिए): अलग होने जा रहा है

>>> id('foo') 
162861592 
>>> id('foo') 
162861568 

गैर अल्फ़ान्यूमेरिक स्ट्रिंग (समान id उपयोग करता है):

>>> id('foo!&9((&') 
162840000 
>>> id('foo!&9((&') 
162840000 
संबंधित मुद्दे