python 可變物件和不可變物件

2021-09-19 23:50:08 字數 3220 閱讀 1240

變數沒有型別,那麼就意味著它可以隨意指向任何物件。python中的變數相當於乙個指標。

當將乙個變數a賦值給另乙個變數b時,無論變數a指向的是可變物件還是不可變物件,變數b指向變數a指向的物件。例:

>>

> alist =[1

,2,3

]>>

> anolist = alist

>>

>

id(alist)

==id

(anolist)

true

>>

> b =

4>>

> c = b

>>

>

id(b)

==id

(c)true

>>

> alist =

['a'

,'b'

,'c'

]>>

>

id(alist)

4419849608

>>

>

id(alist[1]

)4418477784

>>

> alist[1]

='x'

>>

>

id(alist)

4419849608

>>

>

id(alist[1]

)4417797008

>>

>

defmyfunc

(l):..

1)..

.print

(l)...

>>

> l =[1

,2,3

]>>

> myfunc(l)[1

,2,3

,1]>>

> l[1

,2,3

,1]

我們可以看到,可變物件作為引數傳入時,在函式中對其本身進行修改,是會影響到全域性中的這個變數值的,因為函式直接對該位址的值進行了修改。

>>

>

defmyfunc

(a):..

. a +=1.

..print

(a)...

>>

> a =

2>>

> myfunc(a)

3>>

> a

2

對於不可變物件來說,雖然函式中的a值變了,但是全域性中的a值沒變,因為函式中的a值已經對應了另外乙個位址,而全域性中的a值指向的原來位址的值是沒有變的。

例子:

>>

> l =[1

,2]>>

> m = l

>>

>

id(l)

4418649352

>>

> l = l +[3

,4]>>

>

id(l)

4419850056

>>

> l[1

,2,3

,4]>>

> m[1

,2]

>>

> l =[1

,2]>>

> m = l

>>

>

id(l)

4419849928

>>

> l +=[3

,4]>>

>

id(l)

4419849928

>>

> l[1

,2,3

,4]>>

> m[1

,2,3

,4]

可以看出第一種方法會新建物件,而+=會在原物件記憶體塊末尾直接增加。

>>

> list_a =

>>

>

deffun_a()

:... list_a =[1

]...

>>

> fun_a(

)>>

> list_a

>>

> list_b =

>>

>

deffun_b()

:..1

)...

>>

> fun_b(

)>>

> list_b[1

]

解釋:

fun_a()中使用了=, 會建立乙個名為list_a的區域性變數,所以在函式內部就不會訪問全域性變數list_a了。

函式預設引數一定要設定為不可變引數,否則會引發一些錯誤,我們來看下面乙個例子:

>>

>

defmyfunc

(l=)

:..'add').

..print

(l)...

>>

> myfunc([1

,2,3

])[1

,2,3

,'add'

]>>

> myfunc(

['a'

,'b'])

['a'

,'b'

,'add'

]

上面**是正常執行的,我們來看下面這些

>>

> myfunc()[

'add'

]>>

> myfunc()[

'add'

,'add'

]>>

> myfunc()[

'add'

,'add'

,'add'

]

按理說應該每次都是['add'],但是現在出現了意想不到的錯誤。

這是因為l =是在函式定義時就確定下來的了,所以之後每次呼叫這個函式,使用的l都是同乙個,如果不指定這個引數的新值,就會出現上面這個問題。

上面這個l可以預設設定為none,這就是乙個不可變物件。

Python可變物件和不可變物件

python中一切皆物件,每個物件都有其唯一的id,對應的型別和值,其中id指的是物件在記憶體中的位置。根據物件的值是否可修改分為可變物件和不可變物件。其中,不可物件包括 數字,字串,tuple,frozenset 不可變集合 可變物件包括 list,dict,set python中的變數可以指向任...

Python 可變物件和不可變物件

python在heap中分配的物件分成兩類 可變物件和不可變物件。所謂可變物件是指,物件的內容是可變的,例如list。而不可變的物件則相反,表示其內容不可變。一 不可變物件 由於python中的變數存放的是物件引用,所以對於不可變物件而言,儘管物件本身不可變,但變數的物件引用是可變的。從上面得知,不...

可變物件和不可變物件

要理解可變物件和不可變物件,先要理解final關鍵字。參考此部落格 沒有經過原博主的同意便引用了一些,侵刪!final關鍵字可以用來修飾類 方法和變數 成員或區域性 final修飾類時表明這個類不能被繼承。final類中的方法會被隱式的定義為fianl,變數自行定義需要不要被final修飾。fina...