鍍金池/ 問(wèn)答/Python/ Python中函數(shù)和類的生命周期是怎樣的 ?

Python中函數(shù)和類的生命周期是怎樣的 ?

Python 中函數(shù)算是 function 的實(shí)例, 而類算是 type 的實(shí)例, 那么函數(shù)和類的生命周期是怎樣的呢 ?

In [1]: def func():
   ...:     pass
   ...:

In [2]: type(func)
Out[2]: function

In [3]: class Test(object):
   ...:     pass
   ...:

In [4]: type(Test)
Out[4]: type

是被創(chuàng)建后就一直存活到程序運(yùn)行結(jié)束還是按引用計(jì)數(shù)來(lái)算的 ?

如果是按引用計(jì)數(shù)來(lái)計(jì)算, 那么函數(shù)和類的引用計(jì)數(shù)是怎樣計(jì)算的呢 ?

回答
編輯回答
寫(xiě)榮

當(dāng)然還是引用計(jì)數(shù)了啊,計(jì)數(shù)不歸零就不會(huì)被回收了。函數(shù)算是 function 的實(shí)例, 類算是 type 的實(shí)例。把 def func() 理解成 func = new Function() ,此時(shí)該函數(shù)實(shí)例計(jì)數(shù)是 1 ,如果此時(shí)刪除其引用 del func 或者給 func 賦值其他值,致使函數(shù)對(duì)象引用計(jì)數(shù)為0,那它就被回收了,同理的 class Test(object) 視為 Test = new type() ,它的引用計(jì)數(shù)同一般普通的變量計(jì)算方式一樣,沒(méi)什么特別的。所以只要引用計(jì)數(shù)不為 0,那它的生命周期就是整個(gè)程序的生命周期。

這點(diǎn)上,模塊中為了不暴露給用戶私密的函數(shù)或類,都會(huì)在文末進(jìn)行 del 操作,例如標(biāo)準(zhǔn)庫(kù)中 datetime.py 中的文末:

圖片描述

2017年9月17日 02:17
編輯回答
陌離殤

那要看你在哪里定義咯

如果你定義的全局的,那就是整個(gè)程序的生命周期;而如果在 if for 等子塊中定義那就在該子塊局部作用域有效,除非被其他作用域引用

2018年2月18日 16:32