1. 程式人生 > >Python學習筆記——可變物件和不可變物件

Python學習筆記——可變物件和不可變物件

知識點:python中,萬物皆物件。

   python中不存在所謂的傳值呼叫,一切傳遞的都是物件的引用,也可以認為是傳址。

一、可變物件和不可變物件

Python在heap中分配的物件分成兩類:可變物件和不可變物件。所謂可變物件是指,物件的內容可變,而不可變物件是指物件內容不可變。

不可變(immutable):int、字串(string)、float、(數值型number)、元組(tuple)

可變(mutable):字典型(dictionary)、列表型(list)

不可變型別特點:

  看下面的例子(例1)

i = 73
i += 2

從上圖可知,不可變物件的特徵沒有變,變的只是建立了新物件,改變了變數的物件引用。

  看一個例子(例2)

>>>x = 1
>>>y = 1
>>>x = 1
>>> x is y
True
>>>y is z
True

  如上所示,因為整數為不可變,x,y,z在記憶體中均指向一個值為1的記憶體地址,也就是說,x,y,z均指向的是同一個地址,值得注意的是,整形來說,目前僅支援(-1,100)。

  總結一下,不可變物件的優缺點。

    優點是,這樣可以減少重複的值對記憶體空間的佔用

    缺點呢,如例1所示,我要修改這個變數繫結的值,如果記憶體中沒用存在該值的記憶體塊,那麼必須重新開闢一塊記憶體

,把新地址與變數名繫結。而不是修改變數原來指向的記憶體塊的值,這回給執行效率帶來一定的降低。

  下面看一個可變物件的例子(例3)

m=[5,9]
m+=[6]

二、函式引數:

Python函式引數對於可變物件,函式內對引數的改變會影響到原始物件;對於不可變物件,函式內對引數的改變不會影響到原始引數。原因在於:

1、可變物件,引數改變的是可變物件,其內容可以被修改。

2、不可變物件,改變的是函式內變數的指向物件。

參考連結: