首頁  >  文章  >  後端開發  >  詳細分析之Python可變對象與不可變對象

詳細分析之Python可變對象與不可變對象

coldplay.xixi
coldplay.xixi轉載
2020-07-09 17:35:012776瀏覽

詳細分析之Python可變對象與不可變對象

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

  1. id: 當一個物件被創建後,它的id 就不會在改變,這裡的id 其實就是物件在記憶體中的位址,可以使用id() 去查看物件在記憶體中地址。
  2. type: 和id 一樣當物件唄創建之後,它的type 也不能再被改變,type 決定了該物件所能夠支援的操作
  3. value: 物件的值

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

相關學習推薦:python影片教學

#不可變物件

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

    Number: int, float, complex
  1. string
  2. tuple
  3. #frozenset:set 的另一個類型

讓我們透過範例感受一下

範例

>>> x=1
>>> y=x
>>> id(x)==id(y)
True
>>> 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)
False
>>> id(1)==id(y)
True

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

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

>>> a=([1],2,3)
>>> id(a)
4338862696
>>> id(a[0])
4338949128
>>> a[0][0]=0
>>> id(a)
4338862696
>>> id(a[0])
4338949128

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

可變物件

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

    list
  1. dict
  2. set

同樣的透過範例感受一下

範例

>>> c = [1,2,3]
>>> b = 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:{id(nums_list)}')
  nums_list += [10]
  print(f'3 id:{id(nums_list)}')

  
number_list = [5, 6]
print(f'1:{number_list}, id:{id(number_list)}')   
update_list(number_list)
print(f'4:{number_list}, id:{id(number_list)}')
看一下結果

1:[5, 6], id:4457707912
2 id:4457707912

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

在看另外一個例子

eg1

#

def add_num(number):
  print(f'2:{id(number)}')
  number += 1
  print(f'3:{id(number)}')


num = 1
print(f'1:{num}, id:{id(num)}')   
add_num(num)
print(f'4:{num}, id:{id(num)}')
看一下結果

1:1, id:4343768416
2 id:4343768416

3 id:4343768448
4:1, id:4343768416

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

這裡的重點是:

對於可變對象,在函數中的值的改變,會導致對象改變;對於不可變對象,在函數中值的改變,對其不會造成任何影響

以上是詳細分析之Python可變對象與不可變對象的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除