Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么一个新的Python变量的引用计数为108?_Python_Python 3.8_Reference Counting - Fatal编程技术网

为什么一个新的Python变量的引用计数为108?

为什么一个新的Python变量的引用计数为108?,python,python-3.8,reference-counting,Python,Python 3.8,Reference Counting,我一直在做实验,发现了一件奇怪的事情。为什么这个脚本输出108而不是预期的getrefcount的2个单引用+参数 具体数字将取决于安装的详细信息。对我来说: Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>

我一直在做实验,发现了一件奇怪的事情。为什么这个脚本输出108而不是预期的getrefcount的2个单引用+参数


具体数字将取决于安装的详细信息。对我来说:

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)]
 on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getrefcount(1)
101
>>> x = 1
>>> sys.getrefcount(x)
102
>>> sys.getrefcount(1)
102
>>> sys.getrefcount(2)
77
>>> sys.getrefcount(3)
32
>>> x = 256
>>> y = 256
>>> x is y
True
>>> x = 256
>>> y = 257
>>> x is y
False
>>> sys.getrefcount(255)
4
>>> sys.getrefcount(256)
19
>>> sys.getrefcount(257)
3
>>> x = -5
>>> y = -5
>>> x is y
True
>>> x = -6
>>> y = -6
>>> x is y
False
>>> sys.getrefcount(-5)
3
>>> sys.getrefcount(-6)
2
该示例旨在突出显示:

具有引用计数的不是x,而是1。变量名没有引用;它们是参考资料。提到的东西是价值观——在引擎盖下的内存块,它们存储了表示概念(如1)所需的信息

即使谈论变量的引用计数是有意义的,sys.getrefcount与任何其他函数一样,将接收一个值,而不是变量作为其参数。即使编写sys.getrefcountx,sys.getrefcount的内部也无法真正了解x

不同的整数值将具有不同的引用计数。这是因为一堆东西是提前设置的,而设置需要内部东西来存储数值,从而生成对表示这些值的对象的引用

Python的参考C实现的内部逻辑确保,对于小整数,显然,-5到256(含),这与我的记忆相符,但不依赖于这种行为;它充其量对任何实际用途都没有用处,通常是在代码中引入错误和混乱的一种非常好的方法,当计算结果为值1时,使用同一对象表示给定的值,返回现有的1对象,而不是创建表示相同值的新对象。因此,在这个范围内的值至少有一个额外的引用,因为有些东西为了循环使用而跟踪这些对象,需要跟踪它们。当然,他们可能有更多的参考资料;显然,对于内部实现细节而言,256比255更重要

然而,即使超出该范围的数字也会报告有两到三个参考。我敢肯定,这与垃圾收集器如何疯狂地进行手工操作有关。我不知道为什么正整数比负整数多报告一个引用


也许Python有106个内置变量?变量没有引用计数,对象有。作为实现细节,CPython缓存小整数。显然,integer对象1被引用了那么多次——这并不奇怪。用类似1000的东西试试看,数字1可能在解释器中被多次使用。我想如果你使用一个更不寻常的数字,比如7,你会得到更低的引用计数。@mkrieger1-python缓存小整数。您需要超过256。不,我的意思是,尽管缓存了7,但它的引用计数会更低,因为它比1使用得更少。谢谢您的解释!
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)]
 on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getrefcount(1)
101
>>> x = 1
>>> sys.getrefcount(x)
102
>>> sys.getrefcount(1)
102
>>> sys.getrefcount(2)
77
>>> sys.getrefcount(3)
32
>>> x = 256
>>> y = 256
>>> x is y
True
>>> x = 256
>>> y = 257
>>> x is y
False
>>> sys.getrefcount(255)
4
>>> sys.getrefcount(256)
19
>>> sys.getrefcount(257)
3
>>> x = -5
>>> y = -5
>>> x is y
True
>>> x = -6
>>> y = -6
>>> x is y
False
>>> sys.getrefcount(-5)
3
>>> sys.getrefcount(-6)
2