没有指针的dict会发生什么

时间:2013-11-07 06:55:28

标签: python python-3.x dictionary

我对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 中的旧数据会发生什么? 它被删除了还是我应该确定它已经消失了?

1 个答案:

答案 0 :(得分:5)

回过头来回答你的问题,因为没有人做过:

  

我知道MyDict是指向dict的指针

Ehhh。 MyDictdict对象的引用,而不是指针。稍作讨论如下:


你不能在函数中改变不可变类型,因为你正在处理引用,而不是指针。参见:

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最终会发生。