繁体   English   中英

没有指针的字典会发生什么

[英]what happens to a dict with no pointer

我有一个dict()的庞然大物,我不断更新它,像这样:

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)

我知道MyDictdict的指针,所以我的问题是MyDict中的旧数据会怎样? 是删除还是我应该确保它消失了?

由于没有其他人做过,请回来回答您的问题:

我知道MyDict是字典的指针

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


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

def adder(x):
    x = x + 1

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

我不会在兔子洞中走得太远,而只是这样:我不会在adder主体中放入任何会引起a变化的东西。 因为变量是引用,而不是指针。


好的,我们回来了。

所以我的问题是MyDict中的旧数据会怎样?

好吧,它仍然在那里,在某个对象的某个地方,但是您炸掉了对其的引用。 该参考不再是,它不再是。 实际上,现存对旧dict的引用完全为零,这在下一段中将非常重要!

它被删除了吗

本身并不是删除,但你基本上可以它看作删除。 它没有剩余的引用,这意味着它可以进行垃圾回收。 触发时,Python的gc将会出现并摆脱所有没有剩余引用的对象,其中包括所有孤立的dict

但是就像我在评论中所说的那样: 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最终会发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM