天天看點

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,是以在字典中,不可變資料類型不能做鍵。