天天看點

python筆記-可變對象與不可變對象

        python中,萬物皆對象。所有的對象可以分為可變對象與不可變對象兩類。當變量引用不可變對象時,使用該變量的任何操作,都會建立新對象,而不會改變引用的對象。與此相反,變量引用可變對象時,或者可能建立新的對象,或者改變被引用的對象本身,這取決于進行的何種操作。

       1.可變對象與不可變對象

        可變對象是指對象的内容可變,包括字典(dictionary)、清單(list)。

        不可變對象是指對象的内容不可變,包括int、字元串(string)、浮點型(float)、數值型(number)、元組(tuple)。

         2.對不可變對象的操作

         這裡舉一個簡單的例子。

>>>myInt = 27
>>>yourInt = myInt
>>>yourInt
27
>>>yourInt = yourInt + 5
>>>myInt
27
>>>yourInt
32
           

          當聲明  myInt = 27 和  yourInt = myInt 後,myInt 和 yourInt 指向了同一個對象27。當執行  yourInt = yourInt +5後,由于int類型為不可變對象,yourInt會指向一個新的對象32。

       3.對可變對象的操作

>>>list1 = [1,2,3]
>>>list1
[1,2,3]
>>>list2 = list1
>>>list2
[1,2,3]
>>>list1 is list2
True
>>>list1.append(27)
>>>list1
[1,2,3,27]
>>>list2
[1,2,3,27]
           

          對list1做的改變也影響了list2!這是因為list1和list2都引用了同一個對象。由于是可變對象,除非你要求,否則Python不會儲存副本,他會通過重用儲存已存在的對象來節省空間。

         說到這裡,可能有的小夥伴想問,如果想複制清單,而不是引用同一個對象該怎麼辦,這時候可以改用分片[:]的方法,如下所示:

>>>list1 = [1,2,3]
>>>list1
[1,2,3]
>>>list2 = list1[:]
>>>list1 is list2
False
>>>list2
[1,2,3]
>>>list1.append(27)
>>>list1
[1,2,3,27]
>>>list2
[1,2,3]
           

        4.總結

       在 python中,當變量引用不可變對象時,使用該變量的任何操作(連接配接、替換、去除等),都會建立新對象,而不會改變引用的對象。與此相反,變量引用可變對象時,或者可能建立新的對象,或者改變被引用的對象本身,這取決于進行的何種操作。例如,L = [1,2,3],L=  L + [9]和L.append(9)得到的結果都是清單[1,2,3,9]。然而,前者建立了一個新對象,後者卻沒有。