一个python内存分配的问题

发布于 2022-08-28 23:08:38 字数 250 浏览 14 评论 0

如下代码

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

故事↓在人 2022-09-04 23:08:38

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

芯好空 2022-09-04 23:08:38

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

○闲身 2022-09-04 23:08:38

根据官方文档

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()参数引用
还有两个可能是全局和局部指针,数字这样的原始类型应该比较特殊因为是共享的内存

司马昭之心 2022-09-04 23:08:38

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

天涯沦落人 2022-09-04 23:08:38

print sys.getrefcount('1')
9
a = '1'
print sys.getrefcount('1')
10
del a
print sys.getrefcount('1')
9

蓝眼泪 2022-09-04 23:08:38

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文