[英]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"
消息)。
我发现这种行为有点奇怪。
问题是:
locals()
返回的字典是否很长,这是正常的吗? 编辑:我正在使用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.