1

我有一个 ponterdict()并且我不断更新它,就像这样:

def creating_new_dict():
   MyDict = dict()
   #... rest of code - get data to MyDict
   return MyDict

def main():
    while(1):
        MyDict = creating_new_dict()
        time.sleep(20)

我知道MyDict是一个指针,dict所以我的问题是MyDict中的旧数据会发生什么?它是被删除还是我应该确保它消失了?

4

1 回答 1

5

回来回答你的问题,因为没有其他人这样做:

我知道 MyDict 是指向 dict 的指针

嗯。 MyDict是对您的对象的引用dict,而不是指针。稍微题外话如下:


您不能在函数中改变不可变类型,因为您处理的是引用,而不是指针。看:

def adder(x):
    x = x + 1

a = 0
adder(a)
a
Out[4]: 0

我不会在兔子洞里走得太远,但就是这样:我不能把任何东西放进去adder会导致a改变。因为变量是引用,而不是指针。


好的,我们回来了。

所以我的问题是 MyDict 中的旧数据会发生什么?

嗯,它仍然存在,在某个对象的某个地方,但是你炸毁了对它的引用。参考不再存在,它已不复存在。事实上,现存的对 old 的引用完全为零dict,这将在下一段中很重要!

是否被删除

本身并没有被删除,但您基本上可以其视为已删除。它没有剩余的引用,这意味着它有资格进行垃圾回收。Python 的gc,当被触发时,将出现并摆脱所有没有剩余引用的对象,其中包括所有孤立dict的 s。

但就像我在评论中所说的那样:gc不会被触发-现在-,而是在(可能非常接近的)将来的某个时间。多久会发生取决于.. 的东西,包括你正在运行的 python 的味道。cPython(您可能正在运行的那个)通常会立即 gc 对象,但这不能保证并且不应该依赖- 它由实现决定。你可以指望什么 - gc 最终会出现并清理 (好吧,只要你没有禁用它)

还是我应该确保它消失了?

不。没有。不要做垃圾收集器的工作。只有当您有非常具体的性能原因时,您才应该这样做。

还是不信,举个例子吧。

呃,你说的是吧?好的:

class DeleteMe:
    def __del__(self): #called when the object is destroyed, i.e. gc'd
        print(':(')

d = DeleteMe() 
d = DeleteMe() # first one will be garbage collected, leading to sad face
:(

而且,就像我之前说的,你不应该指望:(立即发生,只是 gc 最终会发生。

于 2013-11-07T20:31:17.540 回答