2011-05-23 8 views
22

मैं हाल ही में id के साथ झुका रहा था और महसूस किया कि (सी?) पायथन कुछ समझदार करता है: यह सुनिश्चित करता है कि छोटी चींटियों में हमेशा id समान होता है।दृश्यों के पीछे क्या होता है जब पायथन छोटी चींटियों को जोड़ता है?

>>> a, b, c, d, e = 1, 2, 3, 4, 5 
>>> f, g, h, i, j = 1, 2, 3, 4, 5 
>>> [id(x) == id(y) for x, y in zip([a, b, c, d, e], [f, g, h, i, j])] 
[True, True, True, True, True] 

लेकिन फिर यह आश्चर्य हुआ कि गणितीय परिचालन के परिणामों के लिए यह सच है या नहीं। पता चला है यह है:

>>> nines = [(x + y, 9) for x, y in enumerate(reversed(range(10)))] 
>>> [id(x) == id(y) for x, y in nines] 
[True, True, True, True, True, True, True, True, True, True] 

लगता है जैसे कि यह एन = 257 पर नाकाम रहने शुरू होता है ...

>>> a, b = 200 + 56, 256 
>>> id(a) == id(b) 
True 
>>> a, b = 200 + 57, 257 
>>> id(a) == id(b) 
False 

लेकिन कभी कभी यह अभी भी भी बड़ी संख्या के साथ काम करता है:

>>> [id(2 * x + y) == id(300 + x) for x, y in enumerate(reversed(range(301)))][:10] 
[True, True, True, True, True, True, True, True, True, True] 

क्या हो रहा है यहा पर? पाइथन यह कैसे करता है?

उत्तर

17

पायथन कुछ संख्याओं में int वस्तुओं का पूल रखता है। जब आप उस श्रेणी में एक बनाते हैं, तो आपको वास्तव में पूर्व-मौजूदा का संदर्भ मिलता है। मुझे संदेह है कि यह अनुकूलन कारणों के लिए है।

उस पूल की सीमा के बाहर की संख्या के लिए, जब भी आप एक बनाने का प्रयास करते हैं तो आप एक नई वस्तु वापस लेते हैं।

$ python 
Python 3.2 (r32:88445, Apr 15 2011, 11:09:05) 
[GCC 4.5.2 20110127 (prerelease)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> x = 300 
>>> id(x) 
140570345270544 
>>> id(100+200) 
140570372179568 
>>> id(x*2) 
140570345270512 
>>> id(600) 
140570345270576 

Source

PyObject * PyInt_FromLong (लंबी Ival) वापसी मूल्य: नए संदर्भ। ival के मान के साथ एक नया पूर्णांक ऑब्जेक्ट बनाएं।

वर्तमान कार्यान्वयन -5 और 256 के बीच सभी पूर्णांकों, जब आप उस श्रेणी में एक पूर्णांक बनाने के लिए पूर्णांक वस्तुओं का एक सरणी रहता है आप वास्तव में सिर्फ मौजूदा ऑब्जेक्ट के लिए एक संदर्भ वापस मिलता है। तो यह होना चाहिए जो 1 के मान को बदलने के लिए संभव है। में पायथन के व्यवहार पर संदेह है, यह मामला अपरिभाषित है। :-)

जोर मेरा

+0

संख्याएं बड़ी होने पर क्या होता है? कभी-कभी आईडी अभी भी वही हैं। क्या यह हैश लुकअप या कुछ कर रहा है? – jsau

+0

@jsau: मैंने अपना जवाब उसमें शामिल करने के लिए संपादित किया। – Daenyth

+0

@ डेनथ, हाँ, लेकिन कभी-कभी यह _not_ एक नई वस्तु है; जैसा कि मेरा उदाहरण दर्शाता है, कभी-कभी '2 * x + y' उसी वस्तु को' 300 + x' के रूप में देता है। या क्या मैं गलत समझ रहा हूं कि 'आईडी' क्या करता है? – jsau

2

AFAIK, आईडी के पैरामीटर के आकार के साथ कुछ लेना देना नहीं है। इसे एक जीवन-समय अद्वितीय पहचानकर्ता वापस करना होगा, और यदि वे समवर्ती रूप से मौजूद नहीं हैं, तो यह दो अलग-अलग मानकों के लिए एक ही परिणाम लौटा सकता है।

+0

दस्तावेज़ से: किसी ऑब्जेक्ट की "पहचान" लौटाएं। यह एक पूर्णांक (या लंबा पूर्णांक) है जो इस वस्तु के लिए अपने जीवनकाल के दौरान अद्वितीय और स्थिर होने की गारंटी देता है। गैर-ओवरलैपिंग लाइफटाइम वाले दो ऑब्जेक्ट्स में एक ही आईडी() मान हो सकता है। – Hyperboreus

+0

@ डेनथ: कृपया निर्दिष्ट करें कि क्या गलत है। एर्म, आपने इसे समझाने के बजाय अपनी टिप्पणी क्यों हटा दी? – Hyperboreus

+0

डेनथ के उत्तर से, ऐसा लगता है कि _does_ पैरामीटर के आकार के साथ कुछ करने के लिए है, यदि आकार के अनुसार आप मूल्य की परिमाण का मतलब है। – jsau

18

आप एक नहीं असामान्य जाल में गिर गया है:

id(2 * x + y) == id(300 + x) 

दो भाव 2 * x + y और 300 + x ओवरलैपिंग जीवन काल नहीं है। इसका मतलब है कि पायथन बाएं हाथ की गणना कर सकते हैं, अपनी आईडी ले सकते हैं, और उसके बाद दाएं हाथ की गणना करने से पहले पूर्णांक को मुक्त कर सकते हैं। जब सीपीथन एक पूर्णांक को मुक्त करता है तो यह इसे मुक्त पूर्णांक की सूची में रखता है और फिर इसे अगली बार एक अलग पूर्णांक के लिए फिर से उपयोग करता है।तो गणना के परिणाम होने पर भी आपकी आईडी मेल खाते हैं:

>>> x, y = 100, 40000 
>>> id(2 * x + y) == id(300 + x) 
True 
>>> 2 * x + y, 300 + x 
(40200, 400) 
+1

अहह्ह्ह। ठीक है, यह समझ में आता है। धन्यवाद! – jsau

+0

तो यदि आप ऊपर जो कहते हैं वह सचमुच सच है, तो एक ऐसी भावना है जिसमें पाइथन इनट्स _are_ mutable (केवल कचरा इकट्ठा होने के बाद)। – jsau

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