python動態型別的簡單理解
一、python中一個賦值語句以如下方式執行:以a=3為例
1、建立一個物件來表示值3
2、檢測變數a是否已經被建立,如果沒有,則建立
3、將變數a與第1步中建立的物件連線
具體地說,從技術層面上講,物件有更加複雜的結構,而不僅僅是表示一個值這麼簡單,每個物件都有兩個標準的頭部資訊:一個型別識別符號和一個引用的計數器。型別識別符號標識這個物件的型別,引用計數器用來表示當前有多少個變數引用了這個物件,一旦這個計數器被設定為0,那麼這個物件就會被回收。
在python中要注意的一點:與傳統程式語言,如C、C++等,python的變數沒有型別,型別屬於物件
二、物件的回收
在python中,每當一個變數名被賦予了一個新的物件,之前的那個物件佔用的空間就會被回收(如果沒有其他變數名引用的話),物件的空間自動放入自由記憶體空間池,等待後來的物件的使用。
三、共享引用以及物件在原處修改
現有如下語句:
a=3 b=a在這裡,b和a共同指向了物件3的地址,這時候如果新增語句a=4 最後的結果就是a=4 b=3,因為a=4實際上是又重新生成了一個物件4(數字的不可變性),a指向它,而b仍然指向3
如果a指向的物件是可變的,比如是個列表或者字典:
a=[1,2,3] b=a 這時候進行a.append(4),則最後的結果a=[1,2,3,4] b=[1,2,3,4]因為a.append(4)是在原物件上進行修改,而不是重新生成一個物件(列表是可變的),如果是b.append(4) a也同樣會改變,因為這個改變實際上是對物件的改變
四、關於==和is
在涉及到上面的引用之後,就會涉及到==和is的區別,==是判斷兩個物件的值是否相等,is是用來判斷兩個是否是一個物件
但是注意:在python中,小的整數和字串是會被快取並複用的,所以有的時候x is y會返回true