【Python面试】 说说Python可变与不可变数据类型?
往期面試題:
說說Python變量、函數、類的命名規則?
說說4種常用編碼的區別?
說說Python面向對象三大特性?
說說Python中有幾種數據類型?
廢話不多說,開始今天的題目:
問:說說Python可變與不可變數據類型的區別?
答:Python中看可變與不可變數據類型,主要是看變量所指向的內存地址處的值是否會改變 。?Python 的六種標準數據類型:數字、字符串、列表、元組、字典、集合。
不可變數據(3個):Number(數字)、String(字符串)、Tuple(元組)。
可變數據(3個):List(列表)、Dictionary(字典)、Set(集合)。
下面分別來說說這兩者的具體區別:
1、可變數據類型
可變數據類型:變量所指向的內存地址處的值是可以被改變的 。
本文例子參考如下鏈接:
https://www.cnblogs.com/big-devil/p/7625898.html
使用可變數據類型中的列表 list 為例:
>>> a = [1, 2, 3]
>>> id(a)
41568816??
>>> a = [1, 2, 3]
>>> id(a)
41575088??
>>> a.append(4)
>>> id(a)
41575088??
>>> a += [2]
>>> id(a)
41575088??
>>> a
[1, 2, 3, 4, 2]
從上面的程序中可以看出,進行兩次a = [1, 2, 3]操作,兩次a引用的地址值是不同的,也就是說其實創建了兩個不同的對象,這一點明顯不同于不可變數據類型,所以對于可變數據類型來說,具有同樣值的對象是不同的對象,即在內存中保存了多個同樣值的對象,地址值不同。
接著我們對列表進行添加操作,分別a.append(4)和a += [2],發現這兩個操作使得a引用的對象值變成了上面的最終結果,但是a引用的地址依舊是41575088,也就是說對a進行的操作不會改變a引用的地址值,只是在地址后面又擴充了新的地址,改變了地址里面存放的值。
所以可變數據類型的意思就是說對一個變量進行操作時,其值是可變的,值的變化并不會引起新建對象,即地址是不會變的,只是地址中的內容變化了或者地址得到了擴充。
圖1?python可變數據類型分析
2、不可變數據類型
不可變數據類型:變量所指向的內存地址處的值是不可以被改變。?
使用不可變數據類型中的 int 為例:
>>> x = 1??
>>> id(x)
31106520??
>>> y = 1??
>>> id(y)
31106520??
>>> x = 2??
>>> id(x)
31106508??
>>> y = 2??
>>> id(y)
31106508??
>>> z = y
>>> id(z)
31106508??
>>> x += 2??
>>> id(x)
31106484
上面這段程序,我們先來看x = 1和y = 1兩個操作的結果,從上面的輸出可以看到x和y在此時的地址值是一樣的,也就是說x和y其實是引用了同一個對象,也就是說內存中對于1只占用了一個地址,而不管有多少個引用指向了它,都只有一個地址值,只是有一個引用計數會記錄指向這個地址的引用到底有幾個而已。
當我們進行x = 2賦值時,發現x的地址值變了,雖然還是x這個引用,但是其地址值卻變化了,后面的y = 2以及z = y,使得x、y和z都引用了同一個對象,即2,所以地址值都是一樣的。
當x和y都被賦值2后,1這個對象已經沒有引用指向它了,所以1這個對象占用的內存,即31106520地址要被“垃圾回收”,即1這個對象在內存中已經不存在了。最后,x進行了加2的操作,所以創建了新的對象4,x引用了這個新的對象,而不再引用2這個對象。
圖2?python不可變數據類型分析
如果對于參考答案有不認同的,大家可以在評論區指出和補充,歡迎留言!
總結
以上是生活随笔為你收集整理的【Python面试】 说说Python可变与不可变数据类型?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python面试】 说说Python变
- 下一篇: 【Python面试】 说说Python模