Python 中的 == 與 is 及其餘

摘要:Python 中對於對象的比較分爲值比較和對象身份比較,文中對於兩種比較及引用賦值給出了介紹。node


比較對象值時使用 == 等邏輯操做符,比較的是對象的值;比較對象身份時使用 is 和 is not 操做符,比較的是對象的自己,便可理解爲對象的地址,該地址能夠由id()函數得到。python

理解過程當中能夠類比 C 語言中變量的比較,例如對於變量 a 和 b,比較值至關於 a == b,比較身份至關於 &a == &b,即對兩個變量分別取地址,以後比較這兩個地址。函數

Python 中使用大量使用引用賦值。經過 b = a 的操做,C 語言中是將 a 的值賦給 b,兩個變量的地址不一樣;Python 中則經過引用賦值,直接使 b 和 a 指向相同的地址,這樣就能夠複用內存,使得存儲更高效。
不過在使用過程當中,對於不可改變類型,或者表述爲「標量存儲類型」,這個操做對於用戶是透明的,即對於用戶來講至關於普通複製賦值,以下。使用 b = a 賦值後,能夠看到,兩個變量的 id 是相同的,即內存中地址相同。改變 b 的值後能夠看到,系統自動給 b 分配了新的地址空間,改變 b 並無引發 a 的改變。指針

python>>> a = 1
>>> b = a
>>> id(a)
29667592L
>>> id(b)
29667592L
>>> b += 1
>>> a
1
>>> b
2
>>> id(a)
29667592L
>>> id(b)
29667568L

對於可變類型,Python 真的是使用引用賦值,以下。能夠發現對於 list 類型,改變了 b 的值後 a 也隨之改變,兩個變量的地址是相同的。code

python>>> a = [1, 2]
>>> b = a
>>> id(a)
34412232L
>>> id(b)
34412232L
>>> b += [3]
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> id(a)
34412232L
>>> id(b)
34412232L

若須要對於 list 類型使用複製賦值,須要使用技巧 b = a[:],此時系統會爲 b 分配新的地址,並賦予之一份 a 的拷貝,以下。對象

python>>> a = [1, 2]
>>> b = a[:]
>>> a
[1, 2]
>>> b
[1, 2]
>>> id(a)
34520264L
>>> id(b)
34520456L
>>> b += [3]
>>> a
[1, 2]
>>> b
[1, 2, 3]
>>> id(a)
34520264L
>>> id(b)
34520456L

Python 中對於內存的管理是自動的,不須要程序猿參與。系統對於每一個變量的內存空間添加了一個計數器,沒增長一個引用,即有新的指針指向這個地址時,就對計數器加一,反之減一。當計數器的值爲 0 時,系統回收這塊內存。當使用 del 操做時,直接將該變量所在內存的計數器置爲 0,即直接刪除之。內存

這種管理方式在 Linux/Unix 的文件系統中也在使用,*nix 系統採用 inode 格式來管理文件。這種管理方式採用惟一的 id 來標識文件,而文件名只是一個普通屬性,所以能夠在文件打開過程當中修改文件名。每當對於文件建立一個新的硬連接,系統就會將文件的計數器加一,當計數器的值爲 0 時,表示文件被刪除。變量

相關文章
相關標籤/搜索