全局命名空间中的原因不明的变量

问题描述 投票:0回答:1

我发现如果我没有将函数的返回值赋给变量,它仍然会在全局命名空间中结束。为了重新创建微缩的情况,我创建了一个测试类,以及一个返回该类实例的函数:

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

python garbage-collection jupyter-notebook global-variables
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.