深刻理解python之一——python3對象的一些特性

文章使用markdown寫的,編輯的時候行間距還能夠,顯示的時候行間距好小,我也沒辦法。java

首先,須要明白的是python是一種解釋性語言標準,他能夠由c、java或者其餘語言來實現。在python的標準中,變量是連接式的。舉個例子來講,內存中的對象和變量就像是給內存對象貼變量名標籤而不是給變量盒子裝入東西(數值信息)。或者說是給對象分配變量名,而不是給變量賦值。由於python對象在執行賦值以前就已經創立存在了的。python

對象標識和變量名

id()返回對象的標識,cpython中id()返回的是惟一的內存地址,變量名則是一個便於理解的別名。markdown

is和==的區別

is須要值和內存地址都相等,==只須要值相等。對於此更直觀的表示能夠執行一下id(),就能夠看到不一樣。
is比==更快,不能重載,直接比較的是id。code

變量的可變性

在基礎階段,不少教程都會提到,元祖是不可變的數據類型,因此沒有插入和刪除的操做,只能一次定義。但深究這個問題起來,其實元祖只是在引用上不能變化,但引用的對象是可變的,就致使元祖的值會跟着列表發生變化。淺複製時,多個變量引用同一列表地址,那麼改變一個其餘也會變。深複製是在內存中從新開闢一個區域,將原來的對象包括其中爲對象引用的內容,一同複製到新的區域,並創建新的引用。引用變量的可變性看的是最小對象單位的類型,好比不可變元組中有可變列表對象,列表就是最小的單位,要看它的可變性。列表是可變的,這種特性使得在指向同一個列表對象的狀況下,列表實際的長度和值是能夠改變的。對其餘的類型對象通常不可變,也就不會發生上述變化。對象

最大的威脅在於,將列表做爲參數傳給類方法的時候,類變量和參數綁定了同一個對象,執行完返回後原來的傳入參數的對象發生了變化。除了刻意要去改傳入的列表,不然應該在這以前深複製一個副本,不影響原來的變量的使用。教程

建立列表的幾種寫法

a = [1,2,3]
b=a
b is a
>>True

c = list(a)
c is a
>>False

d = a[:]
d is a
>>False

相似上面使用b=a這樣的辦法建立的列表,其實只是新建了一個引用,並無新建一個對象。若是改變a、b其中一個,另外一個會隨着改變。內存

深複製和淺複製的具體區別

copy模塊能夠完成淺複製和深複製,分別對應方法copy()和deepcopy()。其中,deepcopy()能夠完成對包含循環引用的對象的拷貝。基礎

具體能夠用下面的a分別作兩種拷貝,會發現其中深拷貝獲得的a[1]的內容和另外二者是不一同樣的。變量

a = (1,[2,3],(4,5))

使用兩種拷貝分別複製後查看結果。循環

相關文章
相關標籤/搜索