PYthon 3.6。-神秘的sys.getrefcount()(简单的例子-奇怪的结果)

时间:2018-12-24 18:34:45

标签: python-3.x

我有这样的代码

import sys
test = 1
vvv = test
vvv = 5
print(sys.getrefcount(test))
print(sys.getrefcount(vvv))

我希望2和1或1和1?但我得到了这样的结果

836    37

为什么会有这样的结果?

或更简单

import sys
test = 1
vvv = test
print(sys.getrefcount(test))
print(sys.getrefcount(vvv))

结果是 837 837

1 个答案:

答案 0 :(得分:2)

小整数are interned in CPython。因此,标准库中的许多地方都使用了public class Conv : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { VisualBrush result = new VisualBrush(); result.Stretch = Stretch.Fill; StackPanel container = new StackPanel(); container.Orientation = Orientation.Horizontal; //Generate a colored rectangle for each day. //I just use some random values for illustration. Random rnd = new Random(); for (int i = 0; i < 10; i++) { Rectangle rect = new Rectangle(); rect.Width = 20; rect.Height = 20; rect.Fill = rnd.Next() % 2 == 0 ? Brushes.Red : Brushes.Green; container.Children.Add(rect); } result.Visual = container; return result; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 1之类的数字。文字5指的是同一个对象,无论您使用它多少次,而不是每次都创建一个新对象,这样效率很低。最后我检查了一下,这适用于范围1,但这是您不应该依赖的实现细节。

如果您希望看到一个小的引用计数,请尝试制作一个新对象,而不是重复使用现有对象,例如

[-5, 256]

显然,此处的refcount不能为1,因为您将其作为参数传递给函数(>>> test = object() >>> sys.getrefcount(test) 2 本身),该函数在该函数内部创建了局部变量。

但是,如果您没有先分配它,

getrefcount

  

关于print(sys.getrefcount('j989898989jj'))的内容-它返回3

CPython还会实习大多数有效的Python标识符的字符串文字,从而加速属性访问。确切的规则是您不应该依赖的实现细节。生成一个新的字符串会产生预期的ref计数1.。

>>> sys.getrefcount(object())
1