全局命名空间中无法解释的变量

时间:2019-03-04 07:19:55

标签: python garbage-collection jupyter-notebook global-variables

我发现,如果不将函数的返回值分配给变量,它仍然会在全局命名空间中结束。为了重新创建一个缩影,我创建了一个测试类和一个返回该类实例的函数:

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笔记本中运行它。 谢谢!

1 个答案:

答案 0 :(得分:0)

请参见https://ipython.readthedocs.io/en/stable/interactive/tutorial.html#history

基本上,Ipython会自动捕获test_func()调用返回的对象,从而增加其引用计数。 GC可以按预期工作。这就是为什么通过普通的python解释器运行代码时,看不到testclass实例被保留的原因。