[英]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)
我知道MyDict是dict
的指针,所以我的问题是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.