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