[英]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"
消息)。
我發現這種行為有點奇怪。
問題是:
locals()
返回的字典是否很長,這是正常的嗎? 編輯:我正在使用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.