一个python内存分配的问题
如下代码
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次,为什么会出现这些奇怪的值?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
你引用了一次,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,可以参考楼上依云大牛的解释。