代码之家  ›  专栏  ›  技术社区  ›  SuperGeo

python中的locals()和对象引用

  •  2
  • SuperGeo  · 技术社区  · 8 年前

    我发现了一些关于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()
    

    两者兼而有之 局部变量() T() 创建的对象已被垃圾回收。

    局部变量() 命令(删除第一条注释),它似乎创建了一个字典,其中包含对我的 t 对象。这本词典与任何名字都没有关联,所以我不希望这本词典没有被垃圾收集。

    问题是,运行代码 "STILL EXISTS" . 即使我删除 t型 局部变量()

    有趣的是,如果我打电话的话 t型 “仍然存在” 消息)。

    问题是:

    1. 这本字典是不是很正常 很长 活着,甚至连名字都没有?
    2. 从当前作用域中删除名称时,此词典不会自动更新是正常的还是有任何原因?

    1 回复  |  直到 8 年前
        1
  •  4
  •   user2357112    8 年前

    locals() 很奇怪。在函数中,每个 调用将当前局部变量值复制到与堆栈帧关联的dict中,并返回dict 不 用于实际的局部变量查找,但是 附加到frame对象,并且不是每次都是新的dict;所有 局部变量()

    当你打电话的时候 局部变量() 局部变量() 使用不同的局部变量值在堆栈框架内进行调用。其他一些事情也会更新locals dict,比如检索 f_locals 属性,但局部变量赋值本身不会更新局部变量dict。