欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python3中的指針你了解嗎

 更新時(shí)間:2024年02月28日 08:54:59   作者:DECHIN  
Python這個(gè)編程語(yǔ)言雖然沒(méi)有指針類(lèi)型,但是Python中的可變參量也可以像指針一樣,改變一個(gè)數(shù)值之后,所有指向該數(shù)值的可變參量都會(huì)隨之而改變,這篇文章主要介紹了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)文章

最新評(píng)論