我发现,如果不将函数的返回值分配给变量,它仍然会在全局命名空间中结束。为了重新创建一个缩影,我创建了一个测试类和一个返回该类实例的函数:
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笔记本中运行它。 谢谢!
答案 0 :(得分:0)
请参见https://ipython.readthedocs.io/en/stable/interactive/tutorial.html#history
基本上,Ipython会自动捕获test_func()
调用返回的对象,从而增加其引用计数。 GC可以按预期工作。这就是为什么通过普通的python解释器运行代码时,看不到testclass实例被保留的原因。