在Python中,一切資料都是對象,或者和對象有關.(代碼也可以看作是對象).
每個對象都有一個標識,一個類型,一個值.標識我們可以理解成記憶體位址.對象一建立,標識就不能變了."is"用來比較兩個對象的標識,id()這個函數取對象標識-一個整數,其實就是記憶體位址.
對象的類型也不能變,用來檢測對象支援的操作.同時也定義的此種類型的對象的可能的值.type()這個函數返回對象的類型,(類型本身也是一個對象).
對象的值有可變的和不可變的兩種,也就有了可變對象和不可變對象兩種.英文分別是mutable和immutable, 對象不可變(immutable)和值不可變(unchangeable value)是不同的. 這個比較繞,看原文比較好理解,原文是(The value of an immutable container object that contains a reference to a mutable object can change when the latter's value is changed; however the container is still considered immutable, because the collection of objects it contains cannot be changed. So, immutability is not strictly the same as having an unchangeable value, it is more subtle.).或者這麼說,包容器(container)是不可變對象,假設它包含了可變的對象引用,那麼當它包含的對象的值變化的時候,包容器的值也變化了,但是這個時候,我們說包容器仍然是不可變的,因為它所包含的對象集合是不可變的.對象的可變性是由它的類型所決定的.比如,數值,字串和元組是不可變的,但是字典和列表是可變的.
Python和Java一樣,有記憶體回收機制.對於Python的記憶體回收,我們需要注意下面的情況.在Python庫參考裡面有迴圈回收的詳細控制情況.在使用了跟蹤和調試工具時,一些本來應該回收的對象可能沒有被回收,另外在"try...except"語句裡面也有這種情況.
另外,對於一些包含了"外部"資源的對象,比如檔案和視窗,最好用"try...finally"來顯示的釋放這些資源.一般是close()這個方法.
下面我們來看一下容器(containers),這種對象包含了其他對象的引用.比如,元組,列表和字典.大部分情況,當我們說容器的值的時候就是指這個指本身(對象的引用也是值的一部分),而不是包含的對象.當我們討論容器物件的可變性的時候,就只是說被包含對象的標識了.因此,如果一個不可變對象(如元組)包含了一個可變對象, 那麼只要這個可變對象的值變了則它的值就也改變了.
對於對象的類型,它對對象的行為有很大的影響,甚至對對象的標識也有影響.對於不可變對象(immutable),計算新值的運算子可能實際上返回的是一個已經存在的,具有相同類型和值的對象的引用,對於可變對象(mutable),這個是不允許的.例如"a=1;b=1",a和b可能指向同一個值為1的對象.(也可能不是,這個依賴具體的實現),但是對於"c=[];d=[]",可以確定的是,c和d儲存了兩個不同的,獨立的,新建立的空列表. (需要注意的是對於c=d=[]這種寫法,c和d儲存的是相同的一個對象).