我有这样的代码
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
答案 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