好程式設計師分享Python自動化運維開發實戰四-變數

好程式設計師IT發表於2019-06-18
好程式設計師分享Python自動化運維開發實戰四-變數

導語: 1.什麼是變數2.變數名稱的命名3.變數賦值4.變數儲存資料的方式5.引用計數
什麼是變數:

python學習過程中會用到許多資料,那為了方便操作,需要把這些資料分別用一個簡單的名字代表,方便在接下來的程式中引用。
變數就是代表某個資料(值)的名稱。簡單點說變數就是給資料起個名字

變數名稱的命名:

由字母數字下劃線組成的,且不能以數字開頭,不能使用關鍵字,區分大小寫。
命名慣例

1. 以單一下劃線開頭的變數名(_X)不會被 from module import *語句匯入2. 前後有下劃線的變數名(_X_)是系統定義的變數名,對直譯器有特殊意義3. 以雙下劃線開頭,但結尾沒有雙下劃線的變數名(__X)是類的本地變數4. 透過互動模式執行時,只有單個下劃線的變數名(_)會儲存最後表示式的結果

python命名規範總結

模組名:小寫字母,單詞之間用_分割,比如ad_stats.py包名:和模組名一樣類名:單詞首字母大寫,比如AdStats ConfigUtil全域性變數名:大寫字母,單詞之間用_分割,比如UMBER  COLOR_WRITE普通變數:小寫字母,單詞之間用_分割,比如this_is_a_var例項變數:以_開頭,其他和普通變數一樣,比如_price    _instance_var私有例項變數(外部訪問會報錯):以__開頭(2個下劃線),其他和普通變數一樣          __private_var專有變數: __開頭,__結尾,一般為python的自有變數,不要以這種方式命名          __doc__         __class_
變數賦值:

是變數宣告和定義的過程
單個變數賦值

#!/usr/bin/python# -*- coding: UTF-8 -*-counter = 100  # 賦值整型變數miles = 1000.0 # 浮點型name = "John"  # 字串print counterprint milesprint name       

多個變數賦值

Python允許你同時為多個變數賦值。例如:a = b = c = 1以上例項,建立一個整型物件,值為1,三個變數被分配到相同的記憶體空間上。同時為多個變數賦不同的值。例如:a, b, c = 1, 2, "john"以上例項,兩個整型物件1和2的分配給變數a和b,字串物件"john"分配給變數c。
變數儲存資料的方式:

一般程式語言變數儲存資料的方式:

變數是計算機記憶體中的一塊區域,變數可以儲存規定範圍內的值,而且值是可變的。在建立變數時會在記憶體中開闢一個空間。基於變數的資料型別,直譯器會分配指定記憶體,並決定什麼資料可以被儲存在記憶體中。因此,變數可以指定不同的資料型別,這些變數可以儲存整數,小數或字元。 比如c語言在宣告一個變數a之後,會在記憶體中開闢出一塊兒對應的空間,在此空間中可以儲存不同的值,也就是給變數賦予不同的值

python變數在記憶體中儲存值得方式和其他程式語言不同:

在Python中,變數名沒有型別,但物件有   變數名只是對物件的引用(內部實現為指標)       python中是以資料為主,變數a只是相當於一個記憶體空間的標籤,a=1開闢一塊空間儲存1,之後重新複製a=2是重新開闢出新的空間儲存2,變數名稱a換了個位置指向新空間中的2同樣的地址空間可以有兩個或多個標籤,比如a=1,b=1實際上是a和b指向同一個地址空間檢視變數指向地址空間的地址:使用id(變數名稱)函式    >>> a=1    >>> id(a)    19882304    >>> b=1    >>> id(b)    19882304      上例發現同一個值賦值給不同變數,實際地址空間未發生變化,只是標籤發生了變化
PYTHON內部的引用計數(SYS.GETREFCOUNT):

什麼是引用計數器:
Python內部記錄著所有使用中的物件有多少引用。一個內部跟蹤變數,稱為一個引用計數器。當物件被建立時,就建立了一個引用計數,當這個物件不再需要時,也就是說,這個物件的引用計數變為0時,它被垃圾回收。(這個只是形象的說一下,並不是嚴格的100%正確,但是通俗的理解往往是最好的學習方式)
增加引用計數:
當物件被建立並(將其引用)賦值給變數時,該物件的引用技術就是被設定為1。 當同一個物件的應用或者是物件又被賦值給其他變數時,或者作為引數傳遞給函式,方法或類例項時,或者被賦值為一個視窗物件的成員時,該物件的一個新的引用,或者稱作別名,就被建立(則該物件的引用計數自動加1)
減少引用計數

當物件的引用被銷燬時,引用計數會減少。最明顯的例子就是當引用離開其作用範圍時,這種情況最經常出現在函式執行結束時,所有區域性變數都被自動銷燬,物件的引用計數也就隨之減少。

當變數被賦值給另外一個物件時,源物件的引用技術也會自動減1
其他造成物件的引用計數減少的方式包括使用del語句刪除一個變數,或者當一個物件的引用計數在以下情況會減少:

1. 一個本地引用離開了其作用範圍,比如函式結束2. 物件的別名被顯示的銷燬3. 物件的一個別名被賦值給其他的物件4. 物件被從一個視窗物件中移除5. 視窗物件本身被銷燬   

例子:

>>> import sys>>> a="ab">>> sys.getrefcount("ab")3            第一次結果為3>>> b="ab">>> sys.getrefcount("ab")4             第二次結果+1>>> b=0   b引用了其他的物件(0),對於"ab"來講就取消了一個引用>>> sys.getrefcount("ab")3             結果在上次引用的基礎上-1

注意:在互動式直譯器中帶空格的物件引用次數永遠為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")
垃圾收集 :

不再被使用的記憶體會被一種稱為垃圾收集的機制釋放。像上面說的,雖然直譯器跟蹤物件的引用計數,但是垃圾收集器負責釋放記憶體。垃圾收集器是一塊獨立的程式碼,它用來尋找引用計數為0的物件,他也負責檢查那些雖然引用計數大於0但也該被銷燬的物件。特定情形會導致迴圈引用。一個迴圈引用發生在當你有至少兩個物件互相引用時,也就是所說的引用都消失時,這些引用仍然存在,這說明只靠引用計數是不夠的。Python的垃圾收集器實際上是一個引用計數器和一個迴圈垃圾收集器。當一個物件的引用計數變為0,直譯器會暫停,釋放掉這個物件和僅有這個物件可訪問的其他物件,作為引用計數的補充,垃圾收集器也會留心被分配的總量很大(以及未透過引用計數銷燬的那些)  的物件。在這種情況下,直譯器會暫停下來,試圖清理所有為引用的迴圈。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2648024/,如需轉載,請註明出處,否則將追究法律責任。

相關文章