詳細分析Python可變物件和不可變物件

2022-10-03 18:48:09 字數 2187 閱讀 5831

在 python 中一切都可以看作為物件。每個物件都有各自的 id, type 和 value。

乙個物件可變與否就在於 value 值是否支援改變。

不可變物件

常見的不可變物件(immutable objects):

讓我們通過例子感受一下

例子>&gchixiat;> x=1

>>> y=x

>>> id(x)==id(y)

true

>>>www.cppcns.com; id(1)==id(y)

true

這裡建立了兩個 int 物件,並且讓 x,y 指向同乙個物件,然後我們試著修改一下 x,讓 x+1

>>>x=x+1

這個時候 x 的 id 值和 y 的 id 以及 1 的 id 還一樣嗎?

>>> x=x+1

>>> id(x)==id(y)

false

>>> id(x)==id(1)

falsechixia

>>> id(1)==id(y)

true

從結果不難看出來,x 所指向的物件已經改變了,但是 1 並沒有改變。這就是不可變物件,對於不可變物件來說,一旦建立之後就不允許被改變。

注意: 不可變並不嚴格等同絕對的不可變

>>> a=([1],2,3)

>>> id(a)

4338862696

&www.cppcns.comgt;>> id(a[0])

4338949128

>>> a[0][0]=0

>>> id(a)

4338862696

>>> id(a[0])

4338949128

從上面的例子不難看出,我們改變了 a[0] 的值,但是並沒有影響它的 id 值。乙個不可變容器物件如果包含對可變物件的引用,當後者的值改變時,前者的值也會改變;但是該容器仍屬於不可變物件,因為它的 id 值不會改變的。

可變物件

常見的可變物件(mutable objects):

同樣的通過例子感受一下

例子>>> c = [1,2,3]

>>> b chixia= c

>>> id(b)==id(c)

true

建立兩個 list 物件,並且讓 c,d 指向同乙個物件,然後我們試著修改一下 c

c[0]=4

這個時候在看一下兩個物件的 id 值是否一致

>>> id(c)==id(b)

true

修改之後,c,d 仍然指向同乙個物件,所以不難得出結論,對於乙個可變物件來說,修改 value 值並不會對它的 id 造成任何影響

函式引數

對於可變物件和不可變物件,他們兩者在函式當作引數傳遞的時候表現也有所不同

例子eg0

def update_list(nums_list):

print(f'2 id:')

nums_list += [10]

print(f'3 id:')

number_list = [5, 6]

print(f'1:, id:')

update_list(number_list)

print(f'4:, id:')

看一下結果

1:[5, 6], id:4457707912

2 id:4457707912

3 id:4457707912

4:[5, 6, 10], id:4457707912

在看另外乙個例子

eg1def add_num(number):

print(f'2:')

number += 1

print(f'3:')

num = 1

print(f'1:, id:')

add_num(num)

print(f'4:, id:')

看一下結果

1:1, id:4343768416

2 id:4343768416

3 id:4343768448

4:1, id:4343768416

有其他有些文章中,上面 eg0 被稱為引用傳遞,eg1 被稱為值傳遞。然而在官方文件中,並沒有找到有關的這兩個名詞的任何內容,或者這種方式並不是上述的兩者任意一種。

這裡的重點是:對於可變物件,在函式中的值的改變,會導致物件改變;對於不可變物件,在函式中值的改變,對其不會造成任何影響

const詳細分析

最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...

約數詳細分析

約數詳細分析 我們先來認識一下約數 約數分正約數和負約數兩種,我們一般只討論正約數。也就是說,接下來所提的約數,只考慮正約數。如果有乙個數k,滿足k n,那麼k就是n 的約數 因數 n是k的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...

vue cli 詳細分析

vue lic 是 vue 官方提供的腳手架工具,預設搭建好乙個專案的基本架子,我們只需要在此基礎上進行相應的修改即可。注意 安裝 vue cli 前需要事先配置好 node 環境 npm install g vue cli 如果是 mac 電 sudo表示以管理員的許可權 sudo install...