繁体   English   中英

python中的locals()和对象引用

[英]locals() and object reference in python

我发现了一些关于python如何跟踪locals()对象的好奇心。

考虑以下脚本:

import gc


class T(object):
    pass


def func1():

    t = T()

    #locals()
    del t
    #locals()

    for o in gc.get_objects():
        if type(o) is T:
            print("STILL EXISTS")


func1()

运行两个locals()调用注释(如上所示)没有给我任何消息,表明创建的T()对象是垃圾回收。

当我使用第一个locals()命令(删除第一个注释)运行它时,它似乎创建了一个包含对我的t对象的引用的字典。 这个字典没有与任何名字相关联,所以我不希望这个字典在没有被垃圾收集的情况下存活。

问题是,运行代码,我得到"STILL EXISTS" 即使我从函数名称空间中删除了t ,该对象也不会被垃圾收集,因为locals()返回的dict仍在引用它。

有趣的是,如果我再次调用locals() (删除上面代码中的第二个注释),那么字典会以某种方式更新,它不包含t并且对象被垃圾收集成功(并且我没有得到"STILL EXISTS"消息)。

我发现这种行为有点奇怪。

问题是:

  1. 即使没有将它与任何名称相关联, locals()返回的字典是否很长,这是正常的吗?
  2. 这是正常的还是有任何理由在从当前范围中删除名称时这个字典没有自动更新?

编辑:我正在使用cpython 3.6

谢谢!

locals()很奇怪。 在函数内部,每个locals()调用将当前局部变量值复制到与堆栈帧相关联的dict中并返回dict。 该字典用于实际的本地变量查找,但是连接到框架对象,每一次它不是一个新的字典; 所有locals()调用在同一堆栈帧中重用相同的dict。

当你调用locals() ,locals dict现在引用当前变量当前引用的所有对象。 这将使这些对象保持活动状态,直到堆栈帧死亡,或者在具有不同局部变量值的堆栈帧内进行新的locals()调用。 还有一些其他的东西也会更新locals dict,比如检索堆栈帧对象的f_locals属性,但局部变量赋值不会自动更新locals dict。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM