Python 3.x Python3.8:使用del后类对象数据仍然存在

Python 3.x Python3.8:使用del后类对象数据仍然存在,python-3.x,object,memory,memory-leaks,Python 3.x,Object,Memory,Memory Leaks,我有一个班做一些事情; class: 在循环中,创建类IdoStuff的对象,执行一些操作,然后删除: for i in range(0,50): obj = IdoStuff() # initialize object obj.doStuff() # does something obj.doMoreStuff() # does another thing del obj 在第一次迭代中,一切都按照需要工作,但是在第二次迭代中,我可以通过调

我有一个班做一些事情;
class:

在循环中,创建类
IdoStuff
的对象,执行一些操作,然后删除:

for i in range(0,50):
   obj = IdoStuff()     # initialize object
   obj.doStuff()        # does something
   obj.doMoreStuff()    # does another thing
   del obj
在第一次迭代中,一切都按照需要工作,但是在第二次迭代中,我可以通过调试器看到,一旦创建了第二个对象,第一个对象的变量/数据仍然存在


发生什么事了?我想我用delobj删除了它。我想在每次迭代中创建一个新对象。

尝试将代码编辑为以下内容

for i in range(0,50):
   obj = IdoStuff()     # initialize object
   try:
     print(obj.my_check_attrib)
   except Exception:
     print('failed to access obj.my_check_attrib')
   obj.my_check_attrib = 123
   obj.doStuff()        # does something
   obj.doMoreStuff()    # does another thing
   del obj

如果确实存在任何泄漏,那么您应该只看到错误文本打印一次,属性值打印49次,如果没有泄漏,那么控制台中只会显示错误文本50次。

您确定调试器没有“严重”刷新吗?在创建之后,尝试添加一个
print(obj)
语句或类似的东西,这可能会有所帮助。如果您有一个可以在断点期间使用的实时计算器,请尝试访问
obj
的属性,这些属性本不应该存在,但可能在上一次迭代中就已经存在了。这两件事(特别是第二件,如果可能的话,应该可以帮助你验证这些东西是否确实是从以前的迭代中保留下来的)@Campiotti我认为不是这样的。我试过了,但运气不好。使用我的调试器(使用Pycharm),我可以看到调用
del obj
后对象被删除,但是一旦我创建了另一个对象,我可以看到所有的数据都返回到它在Pycharm上尝试时的状态,在调试器中得到相同的视觉问题,我将在代码方面检查attrib是否仍然存在。无论如何,我没有初始化这个类,所以属性保留了下来,修复了这个问题,我不再出现这个问题。通过初始化,你的意思是我应该做些别的事情,而不是
obj=IdoStuff()
nono我指的是我不小心做了
obj=IdoStuff
,而不是
obj=IdoStuff())
它最终向导入的类添加了属性,而导入的类由于不是实例而是对类本身的引用而保留了下来。基本上你可以忽略我之前的评论,我只是建议你尝试一下我在下面发布的答案——我们应该能够看到确凿的证据来证明是否存在任何类型的泄漏。