Reference counting

Duncan Booth duncan at NOSPAMrcp.co.uk
Fri Aug 30 04:23:58 EDT 2002


Rolf Wester <wester at ilt.fhg.de> wrote in
news:3D6F1CC4.72EE5262 at ilt.fhg.de: 
> Terry Reedy wrote:
>> from python:
>> >>> import sys
>> >>> a = 3
>> >>> sys.getrefcount(a)
>> 10
> Thank you for your reply.
> Can you tell me why getrefcount(a) returns 10? I would have expected
> to get 1. 
> 
Small integers are shared in Python, so your 3 is the same 3 as is used 
elsewhere in the system. On my system:
>>> import sys
>>> a = 3
>>> sys.getrefcount(a)
28
>>> a = 345235
>>> sys.getrefcount(a)
2
>>> 

Note that even the larger value has a reference count of 2: 'a' refers to 
34235, and the parameter of getrefcount also refers to it.

You can use the 'id' builtin to see when values are being shared:

>>> a = 3
>>> b = 66/22
>>> id(a), id(b)
(7626576, 7626576)
>>> a = 300
>>> b = 6600/22
>>> id(a), id(b)
(7781700, 7781976)
>>> a = 'hello'
>>> b = 'hello'
>>> id(a), id(b)
(8210480, 8210480)
>>> 

The small integers are shared, the large integers are not. Some strings are 
also shared. The rules for when you end up with two references to the same 
object, and when you end up with references to separate object can be 
confusing, so it is best not to rely on them too much.

-- 
Duncan Booth                                             duncan at rcp.co.uk
int month(char *p){return(124864/((p[0]+p[1]-p[2]&0x1f)+1)%12)["\5\x8\3"
"\6\7\xb\1\x9\xa\2\0\4"];} // Who said my code was obscure?



More information about the Python-list mailing list