我发现如果我没有将函数的返回值赋给变量,它仍然会在全局命名空间中结束。为了重新创建微缩的情况,我创建了一个测试类,以及一个返回该类实例的函数:
class testclass:
def __init__(self):
pass
def test_func():
return testclass()
然后我创建了一个函数来计算这些变量在全局命名空间中的数量:
def count_tc(glob):
num = 0
for name, obj in glob.items():
if isinstance(obj, testclass):
print(name)
num+=1
return num
如果我最初运行这个count_tc函数,它返回0.但是如果我运行test_func然后重新运行它,我得到:
test_func()
count_tc(globals())
返回
_
_8
2
因此,我们现在在全局命名空间中只有两个变量,但似乎已经分配了_类型名称。
我对python中的垃圾收集过程的理解是,如果没有对象的引用,它就会被删除 - 所以我希望在这种情况下会发生这种情况。这是一个玩具示例,但我将它放在其他内存存在问题的地方,它似乎在制造问题。任何人都可以告诉我这里发生的是什么(或意味着什么)?我不确定这是否相关,但我在Jupyter笔记本中运行它。谢谢!
见https://ipython.readthedocs.io/en/stable/interactive/tutorial.html#history
基本上,Ipython会自动捕获test_func()
调用返回的对象,从而增加其引用计数。 GC按预期工作。这就是为什么当你通过普通的python解释器运行代码时,你没有看到测试类实例被保留的原因。