具有全局Python变量的引用环境

问题描述 投票:0回答:1

在下面的程序中,有一个全局变量 a,我想检查 1、2、3 和 4 点处的引用数量。

import sys

a = 'my-string'
print(sys.getrefcount(a))

b = [a]
print(sys.getrefcount(a))

del b
print(sys.getrefcount(a))

c = { 'key': a }
print(sys.getrefcount(a))

当我执行程序时,我看到引用的数量分别是4、5、4、5。我不明白为什么会这样。

我的第一个想法是,所有的全局变量都是从堆栈的静态段分配的,因此,对于每个

a
b = [a]
c = { 'key': a }
,都有一个引用,组成3个引用。每个
print(sys.getrefcount(a))
都有一个参考,总共 4 个参考。

如果是这样的话,

b = [a]
c = { 'key': a }
之后的语句中的第5个引用来自哪里,特别是删除
b
之后?

python reference global-variables
1个回答
0
投票

我相信参考文献的答案是:

  • 未知的内部,不是字符串缓存,因为这也发生在其他不可变文字上,如浮点数或整数(在 -5 到 255 范围之外)。也许是解析的产物?
  • 模块代码对象常量表
  • 代码对象的框架局部变量中的条目(在本例中为
    globals()
    字典)
  • 将字符串对象传递给
    getrefcount
  • 时创建的引用
  • 变化的是:集合中的参考文献。

您可以观察到有关 CPython 工作方式的一些有趣的事情:

  • 由于在整个代码中相同的文字是完全相同的对象,因此如果您在整个代码中直接引用
    "my-string"
    而不是
    a
    ,数字不会改变
  • 如果您使用浮点数、大/负整数、非空元组和类似内容等文字,则行为将完全相同。
  • 如果你使用小整数、空元组、布尔文字或类似的魔法对象,你会看到不同的东西,具体取决于你的 CPython 版本:要么是一个比其他所有东西都高很多的数字,要么你会看到一个 very大数字意味着最高位已被翻转以指示不朽物体。
  • 如果您使用可变对象,例如列表文字
    []
    object()
    set()
    ,您将看到一个模式
    2,3,2,3
    ,表明上面列表中的前两个整体不再存在。
© www.soinside.com 2019 - 2024. All rights reserved.