什么是Python自動化運(yùn)維內(nèi)部的引用計(jì)數(shù)?
今天小編要跟大家分享的文章是什么是Python自動化運(yùn)維內(nèi)部的引用計(jì)數(shù)?什么時(shí)候增加引用計(jì)數(shù)?什么時(shí)候減少引用計(jì)數(shù)?Python自動化入門新手和正在Python自動化學(xué)習(xí)的小伙伴快來看一看吧,希望能夠?qū)Υ蠹矣兴鶐椭?
Python內(nèi)部的引用計(jì)數(shù)(sys.getrefcount):
什么是引用計(jì)數(shù)器:?
Python內(nèi)部記錄著所有使用中的對象有多少引用。一個(gè)內(nèi)部跟蹤變量,稱為一個(gè)引用計(jì)數(shù)器。當(dāng)對象被創(chuàng)建時(shí),就創(chuàng)建了一個(gè)引用計(jì)數(shù),當(dāng)這個(gè)對象不再需要時(shí),也就是說,這個(gè)對象的引用計(jì)數(shù)變?yōu)?時(shí),它被垃圾回收。(這個(gè)只是形象的說一下,并不是嚴(yán)格的100%正確,但是通俗的理解往往是最好的學(xué)習(xí)方式)
增加引用計(jì)數(shù):
當(dāng)對象被創(chuàng)建并(將其引用)賦值給變量時(shí),該對象的引用技術(shù)就是被設(shè)置為1。
當(dāng)同一個(gè)對象的應(yīng)用或者是對象又被賦值給其他變量時(shí),或者作為參數(shù)傳遞給函數(shù),方法或類實(shí)例時(shí),或者被賦值為一個(gè)窗口對象的成員時(shí),該對象的一個(gè)新的引用,或者稱作別名,就被創(chuàng)建(則該對象的引用計(jì)數(shù)自動加1)
減少引用計(jì)數(shù):
當(dāng)對象的引用被銷毀時(shí),引用計(jì)數(shù)會減少。最明顯的例子就是當(dāng)引用離開其作用范圍時(shí),這種情況最經(jīng)常出現(xiàn)在函數(shù)運(yùn)行結(jié)束時(shí),所有局部變量都被自動銷毀,對象的引用計(jì)數(shù)也就隨之減少。
當(dāng)變量被賦值給另外一個(gè)對象時(shí),源對象的引用技術(shù)也會自動減1
其他造成對象的引用計(jì)數(shù)減少的方式包括使用del語句刪除一個(gè)變量,或者當(dāng)一個(gè)對象的引用計(jì)數(shù)在以下情況會減少:
- 一個(gè)本地引用離開了其作用范圍,比如函數(shù)結(jié)束
- 對象的別名被顯示的銷毀
- 對象的一個(gè)別名被賦值給其他的對象
- 對象被從一個(gè)窗口對象中移除
- 窗口對象本身被銷毀
例子:
import sys
a="ab"
sys.getrefcount("ab")
3 第一次結(jié)果為3
b="ab"
sys.getrefcount("ab")
4 第二次結(jié)果+1
b=0 b引用了其他的對象(0),對于"ab"來講就取消了一個(gè)引用
sys.getrefcount("ab")
3 結(jié)果在上次引用的基礎(chǔ)上-1
注意:在交互式解釋器中帶空格的對象引用次數(shù)永遠(yuǎn)為3,但是在腳本中回歸正常,例如:
#!/usr/bin/env Python
coding=utf8 fdaf
import sys
print sys.getrefcount("ab cd")
a="ab cd"
print sys.getrefcount("ab cd")
b="ab cd"
print sys.getrefcount("ab cd")
c=b
print sys.getrefcount("ab cd")
垃圾收集:
不再被使用的內(nèi)存會被一種稱為垃圾收集的機(jī)制釋放。像上面說的,雖然解釋器跟蹤對象的引用計(jì)數(shù),但是垃圾收集器負(fù)責(zé)釋放內(nèi)存。垃圾收集器是一塊獨(dú)立的代碼,它用來尋找引用計(jì)數(shù)為0的對象,他也負(fù)責(zé)檢查那些雖然引用計(jì)數(shù)大于0但也該被銷毀的對象。特定情形會導(dǎo)致循環(huán)引用。
一個(gè)循環(huán)引用發(fā)生在當(dāng)你有至少兩個(gè)對象互相引用時(shí),也就是所說的引用都消失時(shí),這些引用仍然存在,這說明只靠引用計(jì)數(shù)是不夠的。Python的垃圾收集器實(shí)際上是一個(gè)引用計(jì)數(shù)器和一個(gè)循環(huán)垃圾收集器。當(dāng)一個(gè)對象的引用計(jì)數(shù)變?yōu)?,解釋器會暫停,釋放掉這個(gè)對象和僅有這個(gè)對象可訪問的其他對象,作為引用計(jì)數(shù)的補(bǔ)充,垃圾收集器也會留心被分配的總量很大(以及未通過引用計(jì)數(shù)銷毀的那些) 的對象。在這種情況下,解釋器會暫停下來,試圖清理所有為引用的循環(huán)。
以上就是小編今天為大家分享的什么是Python自動化運(yùn)維內(nèi)部的引用計(jì)數(shù)的文章,希望本篇文章能夠?qū)φ?Python自動化學(xué)習(xí)?和從事Python自動化相關(guān)工作的小伙伴們有所幫助,想要了解更多相關(guān)知識記得關(guān)注馬哥教育官網(wǎng),每天都會有大量優(yōu)質(zhì)內(nèi)容與大家分享!免責(zé)聲明:內(nèi)容和圖片源自網(wǎng)絡(luò),版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請告知,我們將盡快刪除相關(guān)內(nèi)容。