python2.7 - python 函數(shù)或者類 代碼的執(zhí)行順序
問題描述
修改了一下問題,大家直接先看例 3對于簡單的控制語句來說,
x = 1if x > 0: print(’true’)else: print(’false’)
我們都知道當(dāng)判定 x > 0時,else的語句是不會執(zhí)行的,
python 屬于解釋型語言,對于函數(shù)來講,例1# filename test.pydef test1(): pass # test1()
下面是我不知道正確與否的理解:
1,對于java而言,如果沒有對于 test1() 這一行代碼執(zhí)行對函數(shù) test1 的調(diào)用的話,那就整個程序基本上沒有意義,不會有內(nèi)存分配,也不會有執(zhí)行2,但是對于 python 而言,會創(chuàng)建 test1 函數(shù)對象,然后保存 test1 中的一系列操作,這些操作不會被執(zhí)行,即使整個程序沒有對 test1 有任何的調(diào)用操作,但是只要程序沒有結(jié)束,那么 test1 就會一直存在于內(nèi)存中。至于原因,是函數(shù) test1 在程序運(yùn)行后,會成為當(dāng)前模塊對象,即 module __main__ 的屬性。3,而對于 ‘test1’ 這個函數(shù)名而言,他引用了這個函數(shù)對象,所以就算沒有調(diào)用該函數(shù),垃圾回收機(jī)制不會將其回收
嵌套函數(shù) 例2# filename test.pydef test1(): def test2():pass # return test2() # test1()對于例 1,我的理解有錯誤嗎?對比例 2 中 test1 的內(nèi)層函數(shù) test2 的情況是怎么樣的,有調(diào)用和沒有調(diào)用的情況會有什么不同嗎?之前問題可能描述的不太清楚,這兒再舉一個例子 3
>>> class A(object): a = [] def test1(self):pass@classmethod def test2(cls):print(’cls.a’, sys.getrefcount(cls.a))print(’cls.test1:’, sys.getrefcount(cls.test1))>>> A.test2()(’cls.a’, 2)(’cls.test1:’, 1)上面的輸出這個 2 可以理解,但是為什么另一個是 1 呢?
>>> def test3(): def test4():pass >>> sys.getrefcount(test3)2>>> dir(test3)[’__call__’, ’__class__’, ’__closure__’, ’__code__’, ’__defaults__’, ’__delattr__’, ’__dict__’, ’__doc__’, ’__format__’, ’__get__’, ’__getattribute__’, ’__globals__’, ’__hash__’, ’__init__’, ’__module__’, ’__name__’, ’__new__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__’, ’__setattr__’, ’__sizeof__’, ’__str__’, ’__subclasshook__’, ’func_closure’, ’func_code’, ’func_defaults’, ’func_dict’, ’func_doc’, ’func_globals’, ’func_name’]# sys.getrefcount(test4) NameError: name ’test4’ is not defined現(xiàn)在的問題是 test3 中的內(nèi)層函數(shù) test4 在內(nèi)存中嗎?如果在的話,在哪兒?(我覺得是應(yīng)該在內(nèi)存中的)如果沒在的話,為什么沒有 test4? 如果沒有 test4 的話,修改一下上面的代碼又該怎么看 ?
def test3(): def test4():pass return test4 # return test4()剛剛修改了問題的時候,突然想到對于編程來講可能沒什么實(shí)際意義,大家可能都會知道怎么去定義使用內(nèi)層函數(shù)。但我還是希望有人能解答我的問題
問題解答
回答1:建議以後這問題拆成兩個不同問題。(1)沒有調(diào)用該函數(shù), Python還有另一個內(nèi)存管理策略 reference counting:「原理: 記錄一個對象被其他對象引用的次數(shù). 當(dāng)對這個對象的引用移除了, 引用計(jì)數(shù)也減小了. 要是減到0了, 這個對象也就被釋放了」。所以我猜,應(yīng)該是在reference counting 時已回收了。
(2)有沒有調(diào)用就是看某個對象的引用是否移除了,還有是否有reference cycle,這裡的郵件討論串有一個類近的討論,不知道算不算回答了你這個問題。
相關(guān)文章:
1. php - 請問大批量數(shù)據(jù)處理,如何分割?2. javascript - vue過渡效果 css過渡 類名的先后順序3. MySQL主鍵沖突時的更新操作和替換操作在功能上有什么差別(如圖)4. 數(shù)據(jù)庫 - Mysql的存儲過程真的是個坑!求助下面的存儲過程哪里錯啦,實(shí)在是找不到哪里的問題了。5. html5和Flash對抗是什么情況?6. css右浮動字的順序顛倒了7. ios - 類似微博首頁,一張圖的時候是如何確定圖大小的?8. javascript - 我是做web前端的,公司最近有一個項(xiàng)目關(guān)于數(shù)據(jù)統(tǒng)計(jì)的!9. javascript - 如何使用loadash對[object,object,object]形式的數(shù)組進(jìn)行比較10. javascript - vuejs+elementui 購物車價格計(jì)算,點(diǎn)擊加減號修改數(shù)量總價都不會改變,但是計(jì)算執(zhí)行了
