ore*_*nma 1 python dictionary python-3.x
我有一个思考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)
Run Code Online (Sandbox Code Playgroud)
我知道MyDict是一个指针,dict所以我的问题是MyDict中的旧数据会发生什么?它被删除了还是我应该确定它已经消失了?
回来回答你的问题,因为没有人做过:
我知道MyDict是指向dict的指针
Ehhh. MyDict是一个参考给你的dict对象,而不是一个指针.稍作离题如下:
你不能在函数中改变不可变类型,因为你正在处理引用,而不是指针.看到:
def adder(x):
x = x + 1
a = 0
adder(a)
a
Out[4]: 0
Run Code Online (Sandbox Code Playgroud)
我不会在兔子洞里走得太远,但就是这样:我本来没有任何东西可以放进身体里,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
:(
Run Code Online (Sandbox Code Playgroud)
而且,正如我之前所说,你不应该指望:(立即发生,只是gc最终会发生.