Python中可變數據類型和不可變數據類型


一、可變數據類型和不可變數據類型

可變和不可變都是基於內存地址來說的。

  • 不可變數據類型: 當該數據類型的對應變量的值發生了改變,那么它對應的內存地址也會發生改變,對於這種數據類型,就稱不可變數據類型。
  • 可變數據類型 :當該數據類型的對應變量的值發生了改變,那么它對應的內存地址不發生改變,對於這種數據類型,就稱可變數據類型。

總結:不可變數據類型更改后地址發生改變,可變數據類型更改地址不發生改變

二、數據類型分類

在Python中數據類型有:整型,字符串,元組,集合,列表,字典。接下來查看他們分別屬於不可變數據類型還是可變數據類型。

2.1 整型

>>> A = 1
>>> print(id(A),type(A))
140710074386096 <class 'int'>
>>> A = 100
>>> print(id(A),type(A))
140710074389264 <class 'int'>

可以發現,當數據發生改變后,變量的內存地址發生了改變,那整型就是不可變數據類型。

2.2 字符串

>>> str1 = "hello"
>>> print(id(str1),type(str1))
2150342503216 <class 'str'>
>>> str1 = "helloworld"
>>> print(id(str1),type(str1))
2150342503152 <class 'str'>

可以發現,當數據發生改變后,變量的內存地址發生了改變,那字符串就是不可變數據類型。

2.3 元組

元組被稱為只讀列表,即數據可以被查詢,但不能被修改,但是我們可以在元組的元素中存放一個列表,通過更改列表的值來查看元組是屬於可變還是不可變。

>>> list1 = [1,2,3]
>>> tup1 = (1,2,list1)
>>> print(id(tup1),type(tup1))
2150342077440 <class 'tuple'>
>>> list1[2] = 100
>>> print(id(tup1),type(tup1))
2150342077440 <class 'tuple'>

我們可以發現,雖然元組數據發生改變,但是內存地址沒有發生了改變,但是我們不可以以此來判定元組就是可變數據類型。

我們回頭仔細想想元組的定義就是不可變的。修改了元組中列表的值,但是因為列表是可變數據類型,所以雖然在列表中更改了值,但是列表的地址沒有改變,列表在元組中的地址的值沒有改變,所以也就意味着元組沒有發生變化。

我們就可以認為元組是不可變數據類型,因為元組是不可變的。

2.4 集合

集合我們常用來進行去重和關系運算,集合是無序的。

>>> s1 = {1,2,"hello","world"}
>>> print(id(s1),type(s1))
2150342489920 <class 'set'>
>>> s1.add("tom")
>>> print(id(s1),type(s1))
2150342489920 <class 'set'>

我們可以發現,雖然集合數據發生改變,但是內存地址沒有發生了改變,那么集合就是可變數據類型。

2.5 列表

>>> list1 = [23,45,12,"zs"]
>>> print(id(list1),type(list1))
2150342481344 <class 'list'>
>>> list1.append("ls")
>>> print(id(list1),type(list1))
2150342481344 <class 'list'>

我們可以發現,雖然列表數據發生改變,但是內存地址沒有改變,那列表是可變數據類型。

2.6 字典

字典是python中唯一的映射類型,采用鍵值對(key-value)的形式存儲數據。python對key進行哈希函數運算,根據計算的結果決定value的存儲地址,所以字典是無序存儲的。但是在3.6版本后,字典開始是有序的,這是新的版本特征。字典的key值可以是整型,字符串,元組,但是不可以是列表,集合,字典。

>>> info = {'name': 'zhangsan', 'age': 100}
>>> print(id(info),type(info))
2150342011840 <class 'dict'>
>>> info['age'] = 12
>>> print(id(info),type(info))
2150342011840 <class 'dict'>

我們可以發現,雖然字典數據發生改變,但是內存地址沒有發生了改變,那么字典就是可變數據類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM