Python的數據模型-對象,值和類型

      在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保存的是相同的一個對象).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章