Why does
sys.getrefcount() 
return 3 for every large number or simple string?Does that mean that 3 objects reside somewhere in the Program?Also,why doesn't setting x=(very large number) increase that object's ref count?Do those 3 ref counts result from my call to getrefcount? Thank you for clarifying this.
for instance:
>>> sys.getrefcount(4234234555)
3
>>> sys.getrefcount("testing")
3
>>> sys.getrefcount(11111111111111111)
3
>>> x=11111111111111111
>>> sys.getrefcount(11111111111111111)
3 
                Large integer objects are not reused by the interpretor, so you get two distinct objects:
>>> a = 11111
>>> b = 11111
>>> id(a)
40351656
>>> id(b)
40351704
sys.getrefcount(11111) always returns the same number because it measures the reference count of a fresh object.
For small integers, Python always reuses the same object:
>>> sys.getrefcount(1)
73
Usually you would get only one reference to a new object:
>>> sys.getrefcount(object())
1
But integers are allocated in a special pre-malloced area by Python for performance optimization, and I suspect the extra two references have something to do with this.
It's implemented in longobject.c in CPython. (Update: link to Python3.) I do not claim to understand what's really going on. I think there are several things at work that cache temporary references:
print sys.getrefcount('foo1111111111111' + 'bar1111111111111') #1
print sys.getrefcount(111111111111 + 2222222222222)            #2
print sys.getrefcount('foobar333333333333333333')              #3
                        Small strings and integers are cached by Python to save on object construction cost.
The interactive Python interpreter holds a temporary reference to each literal that you enter. Compare getrefcount('foobar') with getrefcount('foo' + 'bar'). (In the latter case, the interpreter has references to 'foo' and 'bar'.)
From the manual:
The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to
getrefcount().
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With