1. 變數是對記憶體中地址的引用
你可能經常聽見有人說:Python 中一切變數都是物件。如果你是初學者的話,可能對此感到非常的困惑。每個人都這麼說,但它究竟是什麼意思?其實這句話要表達的意思是 Python 中所有的資料是如何儲存到記憶體中的地址,而變數實際上是指向儲存該資料記憶體地址的指標。
有點繞口是不是,這麼講假,如你建立了一個變數 x = 123 , 然後輸出它 print(x) 。 實際程式執行的過程是這樣,Python 會把 123 儲存到記憶體的一個地址中,而變數 x 則是指向該記憶體地址的指標,或者說是一個索引,當要列印 x 的時候,Python 會根據這個指標(索引)找到該記憶體地址儲存的資料。
實際上,Python 中不僅僅變數的儲存是這個過程,函式也是如此,即呼叫該函式也將指向該物件(變數)儲存在記憶體中的物件,並且用於該函式的任何變數都將指向這些物件儲存在記憶體中的位置,所以說 Python 中一切變數都是物件。
2."==" 和 "is" 運算子剛開始學習 Python 的時候搞不清這兩種語句: x == y 和 x is y 有什麼區別,其實答案就是上面所說的資料是儲存在記憶體中,而變數是對儲存該資料記憶體地址的引用。 Python 裡 "==" 是相等運算子,是用來判斷兩側物件的值是否相等。 Python 會查詢儲存在記憶體中兩個物件(資料), 並判斷這兩個資料是否相等。 "is"運算子稱為同一性運算子,Python 會查詢兩個物件,檢視它們是否指向記憶體中的同一物件,"is" 是判斷引用的記憶體物件是否相同,而不是記憶體物件儲存的資料。舉個例子:
listA = [1, 2, 3]listB = [1, 2, 3]print( listA == listB )# 輸出 Trueprint( listA is listB )# 輸出 False
由於 listA 和 listB 的儲存值相等, 使用相等運算子的語句結果為 True, 但由於 listA 和 listB 是兩個不同的物件,在記憶體中具有兩個不同的地址,使用同一性運算子則會返回 False 。同樣的原則也適用於 "!=" 和 "is not" 運算子之間。
3. 可變和不可變物件有些物件可以改變內部儲存的資料,而不用改變其儲存的記憶體地址,有些物件則不能。這些可改變的則稱可變物件,不能的則成為不可變物件。 如果可變物件在物件內新增或刪除一條資料,則儲存該物件的記憶體地址將保持不變。如果改變了不可變物件的資料,則會建立一個副本並將其儲存在新的記憶體地址中。
可變物件包括:list,dict,set。不可變物件包括:tuple,string,int,float,bool。這也就是為什麼可以透過函式來新增或刪除 list, dict 中的元素,而 tuple 不能。雖然 tuple 和 list 形式類似。 另一點,如果你編寫的函式引用了一個外部的 dict 資料,在函式內部修改了 dict 的資料,新增也好,刪除也好,那麼它的也會被更改。但是如果你用某種方式改變了 string , 則會在記憶體中建立一個新地址來儲存這個新 string 物件。 不可變物件是用在不需要變化的地方,以免意外更改而產生意外。