玩蛇网提供最新Python编程技术信息以及Python资源下载!
您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容

请教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次,为什么会出现这些奇怪的值?

因为数字和字符串等等在Python中全是对象,同样的对象其id是一样的,参考其他答案可知像数字1,字符’0‘等在Python的环境中绝对不止你写的那几行代码才用到。

根据官方文档

数字高于你期望的是因为临时引用,因为作为getrefcount()参数引用
还有两个可能是全局和局部指针,数字这样的原始类型应该比较特殊因为是共享的内存

你引用了一次,Python 自己内部、标准库还可以引用一些次数嘛。'1' 是短字符串,0 是小整数,被进行过 intern 的,会被反复使用。至于最后那个 'google',一个是全局域里的,一个是调用函数的,还有两个得慢慢找。你换个 'baidu' 或者 'kjfakjdncaoiduf' 结果就是 2 了。

我只python有一个小数字池的东西,就是说一些比较小的数字的使用次数是很多的,所以预先把这些东西都造出来放在内存里,这样每次用到他们的时候就直接引用小数字池里的东西就可以了。这个应该0个refcount很大的原因。
其他的我就不太知道了… 我猜应该是差不多的道理吧…

为了减少操作系统的内存分配和垃圾回收,Python在内存管理上使用了内存池,小于256字节的对象,直接从内存池中获取存储空间。

题主展示的a = '1', b = 0, 都是直接放到内存池中的,所以引用计数要大得多。

'google'等相对较长的字符串,则是正常的引用计数。我这边 google 的引用计数是2,可以参考楼上依云大牛的解释。

玩蛇网文章,转载请注明出处和文章网址:http://www.iplaypy.com/wenda/wd19671.html

相关文章 Recommend

玩蛇网Python互助QQ群,欢迎加入-->: 106381465 玩蛇网Python新手群
修订日期:2017年05月31日 - 17时28分33秒 发布自玩蛇网

我要分享到:

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules