如下代码
import sys
a = '1'
print sys.getrefcount(a) #输出10
b = 0
print sys.getrefcount(b) #输出395
c = 'google'
print sys.getrefcount(c) #输出4
请问这个是为什么,a,b,c指向的在内存中的对象都只被引用了1次,为什么会出现这些奇怪的值?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
你引用了一次,Python 自己内部、标准库还可以引用一些次数嘛。
'1'是短字符串,0是小整数,被进行过 intern 的,会被反复使用。至于最后那个'google',一个是全局域里的,一个是调用函数的,还有两个得慢慢找。你换个'baidu'或者'kjfakjdncaoiduf'结果就是 2 了。我只python有一个小数字池的东西,就是说一些比较小的数字的使用次数是很多的,所以预先把这些东西都造出来放在内存里,这样每次用到他们的时候就直接引用小数字池里的东西就可以了。这个应该0个refcount很大的原因。
其他的我就不太知道了… 我猜应该是差不多的道理吧…
根据官方文档
数字高于你期望的是因为临时引用,因为作为
getrefcount()参数引用还有两个可能是全局和局部指针,数字这样的原始类型应该比较特殊因为是共享的内存
因为数字和字符串等等在Python中全是对象,同样的对象其id是一样的,参考其他答案可知像数字1,字符’0‘等在Python的环境中绝对不止你写的那几行代码才用到。
为了减少操作系统的内存分配和垃圾回收,Python在内存管理上使用了内存池,小于256字节的对象,直接从内存池中获取存储空间。
题主展示的
a = '1',b = 0, 都是直接放到内存池中的,所以引用计数要大得多。而
'google'等相对较长的字符串,则是正常的引用计数。我这边 google 的引用计数是2,可以参考楼上依云大牛的解释。