我对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 中的旧数据会发生什么?
它被删除了还是我应该确定它已经消失了?
答案 0 :(得分:5)
回过头来回答你的问题,因为没有人做过:
我知道MyDict是指向dict的指针
Ehhh。 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最终会发生。