我对 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 中的旧数据会怎样?
它是被删除了还是我应该确保它已经消失了?
最佳答案
回来回答你的问题,因为没有其他人做过:
I know that MyDict is a pointer to the dict
呃。 MyDict
是对您的 dict
对象的引用,而不是指针。稍微题外话如下:
您不能在函数内改变不可变类型,因为您处理的是引用,而不是指针。见:
def adder(x):
x = x + 1
a = 0
adder(a)
a
Out[4]: 0
我不会在兔子洞里走得太远,但就是这样:我无法将任何东西放入 adder
的主体中,这会导致 a
改变。因为变量是引用,而不是指针。
好的,我们回来了。
so My question is what happens to the old data in MyDict?
嗯,它仍然存在,在某个对象的某个地方,但你炸毁了对它的引用。引用不再存在,它已经不存在了。事实上,对旧 dict
的现存引用恰好为零,这在下一段中很重要!
Is it deleted
它本身并没有被删除,但您基本上可以认为它已被删除。它没有剩余的引用,这意味着它符合垃圾收集的条件。 Python 的 gc
在被触发时会出现并清除所有没有剩余引用的对象,其中包括所有孤立的 dict
。
但正如我在评论中所说:gc
不会在现在触发,但会在(可能非常接近的) future 某个时间触发。多快发生取决于.. 东西,包括你运行的是什么风格的 python。 cPython(您可能正在运行的那个)通常会立即 gc 对象,但是这不能保证并且不应依赖 - 它留给实现。您可以指望的是 - gc 会出现并最终清理。(好吧,只要您没有禁用它)
or should I make sure it's gone?
不不不。没有。不要做垃圾收集器的工作。仅当您有非常具体的性能原因时才应该这样做。
I still don't believe you, show me an example.
呃,你是这么说的吧?好的:
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 最终会发生。
关于python - 没有指针的字典会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19829740/