मैं हाल ही में 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]
क्या हो रहा है यहा पर? पाइथन यह कैसे करता है?
संख्याएं बड़ी होने पर क्या होता है? कभी-कभी आईडी अभी भी वही हैं। क्या यह हैश लुकअप या कुछ कर रहा है? – jsau
@jsau: मैंने अपना जवाब उसमें शामिल करने के लिए संपादित किया। – Daenyth
@ डेनथ, हाँ, लेकिन कभी-कभी यह _not_ एक नई वस्तु है; जैसा कि मेरा उदाहरण दर्शाता है, कभी-कभी '2 * x + y' उसी वस्तु को' 300 + x' के रूप में देता है। या क्या मैं गलत समझ रहा हूं कि 'आईडी' क्या करता है? – jsau