【问题标题】:what happens to a dict with no pointer没有指针的 dict 会发生什么
【发布时间】:2013-11-07 06:55:28
【问题描述】:

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

【问题讨论】:

  • 我们通常说“参考”,避开粗俗的 P 词。旧的dict 那时可用于垃圾收集,所以现在不是,但在将来的某个时间,它会被收集。
  • 实际上在 CPython 中,由于对象的引用计数下降到零,它会立即被收集。不过,对于其他实现而言,这可能并非如此。
  • @kindall 是的,我在回答中提到了这一点。

标签: python python-3.x dictionary


【解决方案1】:

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

我知道 MyDict 是一个指向字典的指针

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


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

def adder(x):
    x = x + 1

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

我不会在兔子洞里走得太远,但就是这样:我无法将任何东西放入 adder 的主体中,这会导致 a 发生变化。因为变量是引用,而不是指针。


好的,我们回来了。

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

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

被删除了

它没有被删除本身,但你基本上可以认为它被删除。它没有剩余的引用,这意味着它有资格进行垃圾回收。 Python 的gc 在触发时会出现并删除所有没有剩余引用的对象,其中包括所有孤立的dicts。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多