Python變量使用中的細(xì)節(jié)講解
Python變量在使用的時(shí)候需要大家詳細(xì)的進(jìn)行學(xué)習(xí),因?yàn)樵诤芏嗟牡胤叫枰褂玫接嘘P(guān)變量。如果你能理解這句話,說(shuō)明對(duì)Python變量與數(shù)據(jù)類(lèi)型已經(jīng)有了不錯(cuò)的認(rèn)識(shí)。
看看C#與Python在變量與數(shù)據(jù)類(lèi)型方面的差異就可以。如果你還有疑惑,那么就請(qǐng)完整的讀一下這一章吧。
Python變量聲明和定義
與C#不同,Python在使用變量之前無(wú)須定義它的類(lèi)型,試著運(yùn)行下面的例子:
- i = 12 print i
從上邊我們可以看到,變量 i 在使用前并不需要定義,但是必須聲明以及初始化該變量。試著運(yùn)行下面的例子:
- i = 1
- print i + j
上面的代碼會(huì)產(chǎn)生一個(gè)異常:“NameError: name 'j' is not defined”,Python提示變量 j 沒(méi)有定義。這點(diǎn)和BASIC等弱類(lèi)型的語(yǔ)言不一樣。在BASIC中,執(zhí)行上述代碼的時(shí)候不會(huì)產(chǎn)生異常,你可以在EXCEL的VBA開(kāi)發(fā)環(huán)境里試一下,把print改為MsgBox就可以,結(jié)果會(huì)輸出 1 。這說(shuō)明Python并不是一種類(lèi)似BASIC的弱類(lèi)型語(yǔ)言。
另一方面,Python與C#有一個(gè)很大的差異就是在程序運(yùn)行過(guò)程中,同一變量名可以(在不同階段)代表不同類(lèi)型的數(shù)據(jù),看看下邊的例子:
- i = 1
- print i,type(i),id(i)
- i = 10000000000
- print i,type(i),id(i)
- i = 1.1
- print i,type(i),id(i)
變量 i 的類(lèi)型在程序執(zhí)行過(guò)程中分別經(jīng)歷了int、long和float的變化,這和靜態(tài)類(lèi)型語(yǔ)言(如C等)有很大不同。靜態(tài)語(yǔ)言只要一個(gè)變量獲得了一個(gè)數(shù)據(jù)類(lèi)型,它就會(huì)一直是這個(gè)類(lèi)型,變量名代表的是用來(lái)存放數(shù)據(jù)的內(nèi)存位置。而Python中使用的變量名只是各種數(shù)據(jù)及對(duì)象的引用,用id()獲取的才是存放數(shù)據(jù)的內(nèi)存位置,我們輸入的1、10000000000和1.1三個(gè)數(shù)據(jù)均會(huì)保存在id()所指示的這些內(nèi)存位置中,直到垃圾回收車(chē)把它拉走(在系統(tǒng)確定你不再使用它的時(shí)候)。這是動(dòng)態(tài)語(yǔ)言的典型特征,它確定一個(gè)變量的類(lèi)型是在給它賦值的時(shí)候。
另一方面,Python又是強(qiáng)類(lèi)型的,試著運(yùn)行下邊的例子:
- # -*- coding: utf-8 -*-
- i = 10; j = 'ss'
- print i+j
- #正確的寫(xiě)法是print str(i)+j,輸出10ss
會(huì)產(chǎn)生一個(gè)異常:“TypeError: unsupported operand type(s) for +: 'int' and 'str'”。在BASIC等弱類(lèi)型的語(yǔ)言中,上邊的例子會(huì)正常運(yùn)行并返回(雖然有時(shí)候是不可預(yù)期的)結(jié)果。
所以,我們說(shuō)Python既是一種動(dòng)態(tài)類(lèi)型語(yǔ)言,同時(shí)也是一種強(qiáng)類(lèi)型的語(yǔ)言,這點(diǎn)是和C#不同的地方。對(duì)于Python的這種變量的聲明、定義和使用方式,C#程序員可能要花一段時(shí)間去適應(yīng),不過(guò)相信你會(huì)很快就喜歡上它,因?yàn)樗屖虑樽兊酶雍?jiǎn)單(而且不會(huì)不安全)。而且,C# 4.0 已經(jīng)開(kāi)始用類(lèi)似的方式定義和使用變量(通過(guò)在變量名前加關(guān)鍵字dynamic),如果你先學(xué)了Python變量,將能夠更快的適應(yīng)C# 4.0的動(dòng)態(tài)編程特征。#t#
Python變量的命名規(guī)則
Python與C#的變量(以及函數(shù)、類(lèi)等其它標(biāo)識(shí)符)的命名規(guī)則基本一樣,同樣對(duì)大小寫(xiě)敏感。不一樣的地方是,Python中以下劃線開(kāi)始或者結(jié)束的標(biāo)識(shí)符通常有特殊的意義。例如以一個(gè)下劃線開(kāi)始的標(biāo)識(shí)符(如 _foo)不能用from module import *語(yǔ)句導(dǎo)入。前后均有兩個(gè)下劃線的標(biāo)識(shí)符,如__init__,被特殊方法保留。前邊有兩個(gè)下劃線的標(biāo)識(shí)符,如__bar,被用來(lái)實(shí)現(xiàn)類(lèi)私有屬性,這個(gè)將在“類(lèi)和面向?qū)ο缶幊?rdquo;中再說(shuō)。
最后,Python的關(guān)鍵字不能作為標(biāo)識(shí)符(這個(gè)大家都知道),不過(guò)Python的關(guān)鍵字比C#要少得多,可以google一下,這里就不列出了。