Python3中的指針你了解嗎
技術(shù)背景
在python中定義一個(gè)列表時(shí),我們一定要注意其中的可變對(duì)象的原理。雖然python的語(yǔ)法中沒(méi)有指針,但是實(shí)際上定義一個(gè)列表變量時(shí),是把變量名指到了一個(gè)可變對(duì)象上。如果此時(shí)我們定義另外一個(gè)變量也指到同一個(gè)可變對(duì)象的話,就會(huì)造成一個(gè)“聯(lián)動(dòng)”的現(xiàn)象。也就是改變其中的一個(gè)值時(shí),另一個(gè)值也會(huì)隨之而改變。本文使用的Python版本為Python 3.7.13
測(cè)試案例
這里我們先定義一個(gè)列表a,然后把這個(gè)空的列表a直接賦值給變量b,此時(shí)a和b都是一個(gè)空的列表:
In [1]: a = [] In [2]: b = a In [3]: print (a,b) [] []
那么如果此時(shí)我們修改a的值,那么此前被a賦值的變量b是否也會(huì)隨之改變呢?
In [4]: a.append(1) In [5]: print (a,b) [1] [1] In [6]: a.append(2) In [7]: print (a,b) [1, 2] [1, 2] In [8]: a = [3] In [9]: print (a,b) [3] [1, 2] In [10]: a.append(4) In [11]: print (a,b) [3, 4] [1, 2]
從運(yùn)行結(jié)果來(lái)看,我們可以發(fā)現(xiàn),當(dāng)對(duì)a先后擴(kuò)展一個(gè)元素1和2時(shí),變量b的值也隨之改變,跟a是同步變化的。但是如果把a(bǔ)這個(gè)變量名指向一個(gè)新的列表上,此時(shí)b的值不會(huì)發(fā)生變化。這就相當(dāng)于,給變量a賦新的值的時(shí)候,變量b指向了a原來(lái)的值,而a這個(gè)變量名指向了新的數(shù)值,此后兩者之間的關(guān)聯(lián)就消失了。之所以沒(méi)有指針定義的python編程語(yǔ)言,會(huì)出現(xiàn)這樣的情況,就是因?yàn)榱斜眍?lèi)型屬于可變參量,所以如果把兩個(gè)變量指向同一個(gè)列表,兩個(gè)變量的值是會(huì)同步的,即使初始的列表不是一個(gè)空的列表,結(jié)果也是一樣的:
In [23]: a = [1] In [24]: b = a In [25]: a += [2] In [26]: print (a,b) [1, 2] [1, 2]
而且這個(gè)同步還是雙向的,也就是說(shuō),修改a會(huì)同步到b,修改b也會(huì)同步到a:
In [11]: a = [] In [12]: b = a In [13]: b.append(5) In [14]: print (a,b) [5] [5]
那么除了列表這個(gè)數(shù)據(jù)結(jié)構(gòu)之外,其他類(lèi)型的數(shù)據(jù)結(jié)構(gòu)是否存在類(lèi)似的現(xiàn)象呢?首先用字典類(lèi)型來(lái)測(cè)試一下:
In [10]: a = {} In [11]: b = a In [12]: print (a,b) {} {} In [13]: a[1]=1 In [14]: print (a,b) {1: 1} {1: 1}
經(jīng)過(guò)測(cè)試我們發(fā)現(xiàn),字典也是屬于可變參量的類(lèi)型。除了列表和字典外,其他的就是普通的數(shù)值類(lèi)型和元組Tuple類(lèi)型,還有一些第三方定義的數(shù)據(jù)類(lèi)型,也可以分別測(cè)試一下:
In [15]: a = 1 In [16]: b = a In [17]: a += 1 In [18]: print (a,b) 2 1 In [19]: a = (1,) In [20]: b = a In [21]: a += (2,) In [22]: print (a,b) (1, 2) (1,) In [23]: a = '1' In [24]: b = a In [25]: a += '2' In [26]: print (a,b) 12 1
測(cè)試結(jié)果表明,數(shù)值類(lèi)型和元組類(lèi)型在“鏈?zhǔn)?rdquo;賦值之后,是直接把值給了其他變量的,而不是傳遞一個(gè)指針。但是另一個(gè)需要引起重視的是,第三方numpy所定義的array,也是一個(gè)可變參量:
In [15]: a = 1 In [16]: b = a In [17]: a += 1 In [18]: print (a,b) 2 1 In [19]: a = (1,) In [20]: b = a In [21]: a += (2,) In [22]: print (a,b) (1, 2) (1,) In [23]: a = '1' In [24]: b = a In [25]: a += '2' In [26]: print (a,b) 12 1
可以發(fā)現(xiàn),a和b兩者的結(jié)果也是同步變化的。因?yàn)闆](méi)研究過(guò)Python的底層實(shí)現(xiàn),也許區(qū)分可變參量和非可變參量的方法,就是看其能不能被哈希
?
In [15]: hash(1) Out[15]: 1 In [16]: hash([1]) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-16-0579e98ca3ee> in <module> ----> 1 hash([1]) TypeError: unhashable type: 'list' In [17]: hash({'1':1}) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-17-b18acecf6a20> in <module> ----> 1 hash({'1':1}) TypeError: unhashable type: 'dict' In [18]: hash((1,)) Out[18]: 3430019387558 In [29]: hash(np.array([1.])) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-29-b9e8d96de6be> in <module> ----> 1 hash(np.array([1.])) TypeError: unhashable type: 'numpy.ndarray' In [30]: hash(np.array([1.]).tobytes()) Out[30]: 1211024724661850177
從結(jié)果中我們發(fā)現(xiàn),那些可以被哈希的類(lèi)型都是非可變參量,也就是在“鏈?zhǔn)劫x值”的過(guò)程中不會(huì)發(fā)生“聯(lián)動(dòng)”的類(lèi)型。
總結(jié)概要
假如你在Python中初始化了一個(gè)變量a的值,然后用a來(lái)初始化另一個(gè)變量b,此時(shí)你希望得到的b的數(shù)值是跟a同步變化的,還是獨(dú)立變化的呢?Python這個(gè)編程語(yǔ)言雖然沒(méi)有指針類(lèi)型,但是Python中的可變參量也可以像指針一樣,改變一個(gè)數(shù)值之后,所有指向該數(shù)值的可變參量都會(huì)隨之而改變。就比如說(shuō)改變a的值,會(huì)同步的去改變b的值。那么我們應(yīng)該對(duì)這種類(lèi)型的賦值有所了解,才能夠避免在實(shí)際的編程中犯錯(cuò)。
到此這篇關(guān)于Python3中的指針你了解嗎的文章就介紹到這了,更多相關(guān)Python3 指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3日期與時(shí)間戳轉(zhuǎn)換的幾種方法詳解
我們可以利用內(nèi)置模塊 datetime 獲取當(dāng)前時(shí)間,然后將其轉(zhuǎn)換為對(duì)應(yīng)的時(shí)間戳。這篇文章主要介紹了Python3日期與時(shí)間戳轉(zhuǎn)換的幾種方法,需要的朋友可以參考下2019-06-06Python處理excel根據(jù)全稱(chēng)自動(dòng)填寫(xiě)簡(jiǎn)稱(chēng)
這篇文章主要為大家詳細(xì)介紹了Python處理excel根據(jù)全稱(chēng)自動(dòng)填寫(xiě)簡(jiǎn)稱(chēng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03pytorch 實(shí)現(xiàn)在測(cè)試的時(shí)候啟用dropout
這篇文章主要介紹了pytorch 實(shí)現(xiàn)在測(cè)試的時(shí)候啟用dropout的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python利用open函數(shù)讀寫(xiě)文件的示例詳解
在目前的環(huán)境中,讀取文件應(yīng)該算是最基本的操作了,python也內(nèi)置了讀寫(xiě)文件的函數(shù),讓我們來(lái)看下Python是如何利用open函數(shù)讀寫(xiě)文件吧2023-04-04tensorflow2.0實(shí)現(xiàn)復(fù)雜神經(jīng)網(wǎng)絡(luò)(多輸入多輸出nn,Resnet)
這篇文章主要介紹了tensorflow2.0實(shí)現(xiàn)復(fù)雜神經(jīng)網(wǎng)絡(luò)(多輸入多輸出nn,Resnet),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python中表達(dá)式x += y和x = x+y 的區(qū)別詳解
這篇文章主要跟大家介紹了關(guān)于Python中x += y和x = x+y 的區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06用Python實(shí)現(xiàn)流星雨效果的方法詳解
這篇文章主要為大家介紹了Python實(shí)現(xiàn)流星雨效果的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>2021-12-12PyTorch?模型?onnx?文件導(dǎo)出及調(diào)用詳情
這篇文章主要介紹了PyTorch模型onnx文件導(dǎo)出及調(diào)用詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07