如下代码
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次,为什么会出现这些奇怪的值?
如下代码
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次,为什么会出现这些奇怪的值?
我只python有一个小数字池的东西,就是说一些比较小的数字的使用次数是很多的,所以预先把这些东西都造出来放在内存里,这样每次用到他们的时候就直接引用小数字池里的东西就可以了。这个应该0个refcount很大的原因。
其他的我就不太知道了… 我猜应该是差不多的道理吧…
根据官方文档
Return the reference count of the object. The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to getrefcount().
数字高于你期望的是因为临时引用,因为作为getrefcount()
参数引用
还有两个可能是全局和局部指针,数字这样的原始类型应该比较特殊因为是共享的内存
print sys.getrefcount('1')
9
a = '1'
print sys.getrefcount('1')
10
del a
print sys.getrefcount('1')
9
为了减少操作系统的内存分配和垃圾回收,Python在内存管理上使用了内存池,小于256字节的对象,直接从内存池中获取存储空间。
题主展示的a = '1'
, b = 0
, 都是直接放到内存池中的,所以引用计数要大得多。
而 'google'
等相对较长的字符串,则是正常的引用计数。我这边 google 的引用计数是2,可以参考楼上依云大牛的解释。
6 回答6.8k 阅读✓ 已解决
4 回答4.5k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.9k 阅读✓ 已解决
你引用了一次,Python 自己内部、标准库还可以引用一些次数嘛。
'1'
是短字符串,0
是小整数,被进行过 intern 的,会被反复使用。至于最后那个'google'
,一个是全局域里的,一个是调用函数的,还有两个得慢慢找。你换个'baidu'
或者'kjfakjdncaoiduf'
结果就是 2 了。