On Thu, Jan 7, 2010 at 1:44 PM, leela vadlamudi <[email protected]>wrote:
> Hi, > > Python docs says that id function returns the unique id for an object. > > >>> id(10) > 165936452 > >>> a=10 > >>> id(a) > 165936452 > >>> b = int(10) > >>> id(b) > 165936452 > > >>> x = tuple() > >>> y=tuple() > >>> id(x) > -1208311764 > >>> id(y) > -1208311764 > > >>> l = list() > >>> m = list() > >>> id(l) > -1210839956 > >>> id(m) > -1210839700 > > >From the above example, id(mutable_object) returns different ids, but > id(immutable_object) return always the same id. If I try to create new > immutable object, It is just returning the existed object instead of > creating new. How does it internally manages to return the same object? > Why > it is not creating new object if it is immutable? > Python caches immutable objects - which is why they are immutable and saves memory if u reference the same immutable in many places. So small integers, empty tuples and such are actually cached in Python runtime, so you keep getting back the same object and hence the same id. A few examples (as above). >>> id(()) 140641378807888 >>> id(()) 140641378807888 >>> id(x) 140641378807888 >>> id(1) 15611384 >>> x=1 >>> id(x) 15611384 >>> y=1 >>> id(y) 15611384 >>> x=99 >>> id(x) 15613016 >>> y=99 >>> id(y) 15613016 >>> x=100 >>> id(x) 15612992 But this is only valid till a limit. For egs, >>> x=500 >>> y=500 >>> id(x) 16843192 >>> id(y) 16843240 It is a good exercise to find out the limit till Python caches integers. My guess is that it is somewhere close to 100, i.e 100+. Lists are mutable, hence you get different objects when you create different lists with same contents. > > What about this below case? > > >>> id((1,)) > -1208770004 > >>> id((1,)) > -1208770004 > >>> a=(1,) > >>> id(a) > -1208745460 > >>> id((1,)) > -1208759028 > > Why is id changes here even if it is a tuple(immutable). > >>> id((1,)) 16398480 >>> a=(1,) >>> id(a) 16398480 So far so good... But, >>> id((1,)) 16398608 The id of ((1,)) changes after it is bound to a variable. Not sure why this happens. However this doesn't mean that Python caches *all* tuples in memory. As I said caching is done only for integers upto a limit and for "trivial" immutables like the empty () etc. Not for *all* immutables. For egs. >>> x=(1,5,7) >>> y=(1,5,7) >>> x==y True >>> x is y False >>> id(x) 16384960 >>> id(y) 16384400 Strings are much better cached in Python than tuples. >>> x='python' >>> y='python' >>> id(x) 140641378993328 >>> id(y) 140641378993328 If you create two strings containing same value one after another, they are cached most of the time... >>> y='12345678910987654321' >>> x='12345678910987654321' >>> id(x) 16398640 >>> id(y) 16398640 --Anand _______________________________________________ > BangPypers mailing list > [email protected] > http://mail.python.org/mailman/listinfo/bangpypers > -- --Anand _______________________________________________ BangPypers mailing list [email protected] http://mail.python.org/mailman/listinfo/bangpypers
