Python之引用(可變與不可變數據類型)

一.引用

     當我們在使用調用函數時,可變類型與不可變類型的變量分別作爲函數參數時,會有什麼不同嗎?函數傳遞參數引用請點擊詳解

在Python中是沒有指針的概念,但是我們要注意引用。

下面看一段代碼:

>>> a=100
>>> b=a
>>> id(a)
507101952
>>> id(b)
507101952

這裏我們可以發現a和b的地址是一摸一樣的,Python與C語言不同,這樣的分配方式節約空間,而在C語言中會分別給a和b分配兩個不同的地址。但在Python中,當我們對其進行修改時,會怎樣呢?

看下面的代碼

>>> a=200
>>> b
100
>>> id(b)
507101952
>>> id(a)
507105152
>>> c=a
>>> id(c)
507105152
這裏可以清晰的看出來在Python中,a和b的數值一樣時,所以兩個地址是一樣的,當對a變量修改時,b的地址不會變,而是爲修改的b變量重新分配一個唯一的標識即b地址改變。而當a賦值給c時,c的地址和改變後的b地址是一樣的。下面看當變量是列表時,還會一樣嗎?
>>> A=[11,22]
>>> B=A
>>> id(A)
6467080
>>> id(B)
6467080
>>> A.append(33)
>>> A
[11, 22, 33]
>>> B
[11, 22, 33]
>>> id(A)
6467080
>>> id(B)
6467080
這時,我們發現A賦值給B,當A發生改變時,B也會跟着同樣改變,且兩者的地址並不會發生改變。這是爲什麼呢?在Python中,我們需要注意有分可變類型和不可變類型

可變類型:列表、字典

不可變類型:數字、字符串、元祖

因此,當我們企圖對數字修改時,數字是屬於不可變類型,於是,它重新分配地址,而對於列表,它屬於可變類型,當我們進行修改時,便會在原來的地址處進行更改。

二.字典的存儲

下面我們看一下字典與引用的關係,代碼如下

>>> M={"score":100,(11,22):110,521:1314}
>>> M
{521: 1314, (11, 22): 110, 'score': 100}
>>> M={"score":100,(11,22):110,521:1314,[11,22]:88}

 Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    M={"score":100,(11,22):110,521:1314,[11,22]:88}
TypeError: unhashable type: 'list'
通過代碼可以看出來,在字典中,鍵只能是不可變類型來擔任,可變類型不可以是字典中的鍵,否則會報錯。這是因爲在字典中的存取是很特別的,是以哈希表的方式。字典中的每一個鍵都產生一個唯一的數值,而這個唯一的數值就會作爲鍵對應的value的地址,當查找時,通過鍵就會很快找到對應的value;若鍵是可變數據類型,當鍵發生改變,就再也找不到對應的value,所以在字典中,不可變數據類型不能做鍵。



 























































































































































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章