簡體   English   中英

python中的locals()和對象引用

[英]locals() and object reference in python

我發現了一些關於python如何跟蹤locals()對象的好奇心。

考慮以下腳本:

import gc


class T(object):
    pass


def func1():

    t = T()

    #locals()
    del t
    #locals()

    for o in gc.get_objects():
        if type(o) is T:
            print("STILL EXISTS")


func1()

運行兩個locals()調用注釋(如上所示)沒有給我任何消息,表明創建的T()對象是垃圾回收。

當我使用第一個locals()命令(刪除第一個注釋)運行它時,它似乎創建了一個包含對我的t對象的引用的字典。 這個字典沒有與任何名字相關聯,所以我不希望這個字典在沒有被垃圾收集的情況下存活。

問題是,運行代碼,我得到"STILL EXISTS" 即使我從函數名稱空間中刪除了t ,該對象也不會被垃圾收集,因為locals()返回的dict仍在引用它。

有趣的是,如果我再次調用locals() (刪除上面代碼中的第二個注釋),那么字典會以某種方式更新,它不包含t並且對象被垃圾收集成功(並且我沒有得到"STILL EXISTS"消息)。

我發現這種行為有點奇怪。

問題是:

  1. 即使沒有將它與任何名稱相關聯, locals()返回的字典是否很長,這是正常的嗎?
  2. 這是正常的還是有任何理由在從當前范圍中刪除名稱時這個字典沒有自動更新?

編輯:我正在使用cpython 3.6

謝謝!

locals()很奇怪。 在函數內部,每個locals()調用將當前局部變量值復制到與堆棧幀相關聯的dict中並返回dict。 該字典用於實際的本地變量查找,但是連接到框架對象,每一次它不是一個新的字典; 所有locals()調用在同一堆棧幀中重用相同的dict。

當你調用locals() ,locals dict現在引用當前變量當前引用的所有對象。 這將使這些對象保持活動狀態,直到堆棧幀死亡,或者在具有不同局部變量值的堆棧幀內進行新的locals()調用。 還有一些其他的東西也會更新locals dict,比如檢索堆棧幀對象的f_locals屬性,但局部變量賦值不會自動更新locals dict。

暫無
暫無

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

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