簡體   English   中英

沒有指針的字典會發生什么

[英]what happens to a dict with no pointer

我有一個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)

我知道MyDictdict的指針,所以我的問題是MyDict中的舊數據會怎樣? 是刪除還是我應該確保它消失了?

由於沒有其他人做過,請回來回答您的問題:

我知道MyDict是字典的指針

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最終會發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM