Python基礎(chǔ)知識(shí)之變量的詳解
一.定義
在python中,變量名只有在第一次出現(xiàn)的時(shí)候,才是定義變量。當(dāng)再次出現(xiàn)時(shí),不是定義變量,而是直接調(diào)用之前定義的變量。
二.命名方法
2.1小駝峰命名法
第一個(gè)單詞以小寫(xiě)字母開(kāi)始,后續(xù)單詞的首字母大寫(xiě)
firstName , lastName
2.2大駝峰命名法
每一個(gè)單詞的首字母都采用大寫(xiě)字母
FirstName , LastName
2.3下劃線命名法
每個(gè)單詞之間用下劃線連接起來(lái)
first_name , last_name
三.命名規(guī)則
3.1標(biāo)識(shí)符
開(kāi)發(fā)人員自定義的一些符號(hào)和名稱(chēng)
如:變量名、函數(shù)名、類(lèi)名
標(biāo)識(shí)符命名規(guī)則
1.只能由數(shù)字、字母、下劃線組成,且不能以數(shù)字開(kāi)頭
2.不能和python中的關(guān)鍵字重名
3.盡量做到見(jiàn)名知義
4.不能使用單字符(i,o)作為變量名,因?yàn)樘?和1了
5.函數(shù)首字母小寫(xiě),類(lèi)的首字母大寫(xiě)
3.2關(guān)鍵字
1.關(guān)鍵字就是在python內(nèi)部已經(jīng)使用的標(biāo)識(shí)符
2.關(guān)鍵字具有特殊的功能和含義
3.開(kāi)發(fā)者不允許定義和關(guān)鍵字相同的名字的標(biāo)識(shí)符
注意:
1.命名規(guī)則可以被視為一種慣例,無(wú)絕對(duì)與強(qiáng)制,目的是為了增加代碼的識(shí)別和可讀性
2.python中的標(biāo)識(shí)符是區(qū)分大小寫(xiě)的
3.在定義變量時(shí),為了保證代碼格式,遵循PEP8規(guī)范,等號(hào)(=)的左右兩邊該各保留一個(gè)空格
四.使用方法
4.1單變量賦值:
變量名 = 值
例:a = 1
在python中賦值語(yǔ)句總是建立對(duì)象的引用值,而不是復(fù)制對(duì)象。因此,python中的變量存儲(chǔ)的是引用數(shù)據(jù)的內(nèi)存地址,而不是數(shù)據(jù)存儲(chǔ)區(qū)域。

當(dāng)涉及多個(gè)變量時(shí):
a = 1 b = a c = b print(a) # 1 print(id(a)) # 140710098927888 print(b) # 1 print(id(b)) # 140710098927888 print(c) # 1 print(id(c)) # 140710098927888
a、b、c三個(gè)變量的值都等于1,即使在最初定義變量的時(shí)候b和c不是直接等于1的,但是他們?nèi)匀淮鎯?chǔ)著指向“1”的內(nèi)存地址。
4.2底層邏輯:

4.3總結(jié):
可以說(shuō)Python中沒(méi)有賦值,只有引用。Python 沒(méi)有“變量”,我們平時(shí)所說(shuō)的變量其實(shí)只是“標(biāo)簽”,是引用。
當(dāng)創(chuàng)建了無(wú)數(shù)個(gè)變量=1時(shí),在內(nèi)存中,只會(huì)開(kāi)辟無(wú)數(shù)個(gè)空間存儲(chǔ)變量,再開(kāi)辟一個(gè)空間存儲(chǔ)“1”,而這些變量中存儲(chǔ)的內(nèi)存地址都相同,全都指向“1”的內(nèi)存地址。
在代碼層面,看起來(lái)像是給變量賦值,但是在底層卻是變量指向值,也就是變量引用了值。
相信大家還有疑問(wèn),那么請(qǐng)繼續(xù)閱讀
5.變量進(jìn)階
先提出一個(gè)問(wèn)題:
a = [0, 1, 2] a[1] = a print(a)
猜想結(jié)果是:
[0, [0, 1, 2], 2]
但是真正的結(jié)果是:
[0, [...], 2]
為什么結(jié)果會(huì)賦值了無(wú)限次??
結(jié)合剛才得出的結(jié)論:Python中沒(méi)有賦值,只有引用。
真相是:
這樣相當(dāng)于創(chuàng)建了一個(gè)引用自身的結(jié)構(gòu),所以導(dǎo)致了無(wú)限循環(huán)。
通過(guò)遞歸函數(shù)可能更好理解:
a = [0,1,2]
a[1] = a
def fun1(n1):
for i in n1:
if type(i) == list:
return fun1(n1)
else:
print(i)
print(fun1(a[1]))
結(jié)果:

果然是:調(diào)用Python對(duì)象時(shí)超出最大遞歸深度。
底層邏輯:a[1] = a 造成了遞歸引用

當(dāng)調(diào)用變量a時(shí),就是調(diào)用[0,1,2],此時(shí) [0,1,2] 的結(jié)構(gòu)變成了 [0,?,2] ,而 ? 又指向 [0,?,2] 本身,以此類(lèi)推,造成了遞歸調(diào)用的情況。
所以在遍歷a并輸出的時(shí)候會(huì)引起超出最大遞歸深度的錯(cuò)誤。
想得到 [0, [0, 1, 2], 2] 的結(jié)果并不難:
a = [0,1,2] a[1] = a[:] print(a) # [0, [0, 1, 2], 2]
a[:] = a[0:尾部索引值:1]
生成對(duì)象的淺拷貝或者是復(fù)制序列,不再是引用和共享變量,但此法只能頂層復(fù)制
6. a = a + 1 和 a += 1 的區(qū)別
既然談到了賦值和引用的區(qū)別,那就捎帶談一下a = a + 1 和 a += 1 的區(qū)別:
直接上代碼:
a = [1, 2]
b = a
print(id(a)) # 1878561149448
print(id(b)) # 1878561149448
a = a + [1, 2]
print(a, b) # [1, 2, 1, 2] [1, 2]
print(id(a)) # 1878593529288
print(id(b)) # 1878561149448
print ("-------------------")
a = [1, 2]
b = a
print(id(a)) # 1878561149960
print(id(b)) # 1878561149960
a += [1, 2]
print(a, b) # [1, 2, 1, 2] [1, 2, 1, 2]
print(id(a)) # 1878561149960
print(id(b)) # 1878561149960
通過(guò)對(duì)比發(fā)現(xiàn)問(wèn)題:變量a通過(guò)“=” 和 “+=”運(yùn)算,得到的變量b竟然是不同的,運(yùn)算后變量a的id竟然也是不同的。
執(zhí)行a = a + [1, 2] 后:
變量b指向的值并未發(fā)生改變,而變量a的id發(fā)生了變化,值也發(fā)生了變化
執(zhí)行a += [1, 2] 后:
變量a和b的值都發(fā)生了改變,而二者的id卻沒(méi)有改變
具體原因,看圖說(shuō)話(huà):
執(zhí)行a = a + [1, 2] 后,會(huì)生成一個(gè)新對(duì)象,并在cpu上開(kāi)辟一塊空間存儲(chǔ) a + [1, 2] ,然后由a指向它。所以變量a的id發(fā)生了變化,值也發(fā)生了變化。此時(shí)變量b指向的值并未發(fā)生改變。

執(zhí)行a += [1, 2] 后:并不會(huì)生成新對(duì)象,只是把a(bǔ)原本指向內(nèi)存地址的對(duì)象的值改變成了 a + [1, 2],所以變量a和b的值都發(fā)生了改變,而二者的id卻沒(méi)有改變。

對(duì)于可變對(duì)象類(lèi)型和不可變對(duì)象類(lèi)型有不同的結(jié)果:
可變對(duì)象類(lèi)型:+=改變了原本地址上對(duì)象的值,不改變?cè)镜闹赶虻刂罚?則改變了原本的指向地址,創(chuàng)建了新的對(duì)象,并指向新的地址
不可改變對(duì)象類(lèi)型:都是改變?cè)镜闹赶虻刂罚赶蛐聞?chuàng)建的對(duì)象地址
a = 'abc'
b = a
print(id(a)) # 1629835782384
print(id(b)) # 1629835782384
a = a + 'd'
print(a, b) # abcd abc
print(id(a)) # 1629835853168
print(id(b)) # 1629835782384
print ("-------------------")
a = 'abc'
b = a
print(id(a)) # 1629835782384
print(id(b)) # 1629835782384
a += 'd'
print(a, b) # abcd abc
print(id(a)) # 1629835782384
print(id(b)) # 1629835782384
到此這篇關(guān)于Python基礎(chǔ)知識(shí)之變量的詳解的文章就介紹到這了,更多相關(guān)python變量詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基于socket實(shí)現(xiàn)TCP/IP客戶(hù)和服務(wù)器通信
本主要介紹了Python socket網(wǎng)絡(luò)編程TCP/IP服務(wù)器與客戶(hù)端通信的相關(guān)資料,這里對(duì)Scoket 進(jìn)行詳解并創(chuàng)建TCP服務(wù)器及TCP 客戶(hù)端實(shí)例代碼,需要的朋友可以參考下2021-06-06
解決Python獲取文件提示找不到指定路徑can‘t?open?file?'area.py':
這篇文章主要給大家介紹了關(guān)于如何解決Python獲取文件提示找不到指定路徑can‘t?open?file?'area.py':[Errno?2]?No?such?file?or?directory的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
Linux下將Python的Django項(xiàng)目部署到Apache服務(wù)器
這篇文章主要介紹了Python的Django項(xiàng)目部署到Apache服務(wù)器上的要點(diǎn)總結(jié),文中針對(duì)的是wsgi連接方式,需要的朋友可以參考下2015-12-12
20行Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具的實(shí)現(xiàn)
這篇文章主要介紹了20行Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Python機(jī)器學(xué)習(xí)pytorch模型選擇及欠擬合和過(guò)擬合詳解
如何發(fā)現(xiàn)可以泛化的模式是機(jī)器學(xué)習(xí)的根本問(wèn)題,將模型在訓(xùn)練數(shù)據(jù)上過(guò)擬合得比潛在分布中更接近的現(xiàn)象稱(chēng)為過(guò)擬合,用于對(duì)抗過(guò)擬合的技術(shù)稱(chēng)為正則化2021-10-10
Python實(shí)現(xiàn)基于TCP UDP協(xié)議的IPv4 IPv6模式客戶(hù)端和服務(wù)端功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)基于TCP UDP協(xié)議的IPv4 IPv6模式客戶(hù)端和服務(wù)端功能,結(jié)合實(shí)例形式分析了Python基于TCP UDP協(xié)議的IPv4 IPv6模式客戶(hù)端和服務(wù)端數(shù)據(jù)發(fā)送與接收相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
Python3中PyQt5簡(jiǎn)單實(shí)現(xiàn)文件打開(kāi)及保存
本文將結(jié)合實(shí)例代碼,介紹Python3中PyQt5簡(jiǎn)單實(shí)現(xiàn)文件打開(kāi)及保存,具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
如何在Python中捕獲finally語(yǔ)句中異常消息
正常情況下,finally語(yǔ)句不會(huì)捕獲異常,而是在異常處理完成后執(zhí)行,那么如何在Python中捕獲finally語(yǔ)句中異常消息呢,下面小編就來(lái)和大家詳細(xì)聊聊2024-02-02

