Python 變量
(1)變量的數(shù)據(jù)類(lèi)型?
? 一般而言,變量需要先定義,后使用,變量的數(shù) 據(jù)類(lèi)型決定了變量占用多少個(gè)字節(jié)的內(nèi)存單元。?
? 例:C 語(yǔ)言中的變量,需要在程序編譯時(shí)確定數(shù) 據(jù)類(lèi)型并分配相應(yīng)的內(nèi)存單元。這種在使用變量 之前定義其數(shù)據(jù)類(lèi)型的語(yǔ)言稱(chēng)為靜態(tài)類(lèi)型語(yǔ)言。?
? 但Python 語(yǔ)言不同,它是一種動(dòng)態(tài)類(lèi)型語(yǔ)言。
? Python 是一種動(dòng)態(tài)類(lèi)型語(yǔ)言。
? 這種動(dòng)態(tài)類(lèi)型語(yǔ)言確定變量的數(shù)據(jù)類(lèi)型是在給變 量賦值的時(shí)候,對(duì)變量的每一次賦值,都可能改 變變量的類(lèi)型。?
? 在Python 中使用變量時(shí)不用像C 語(yǔ)言那樣先定義 數(shù)據(jù)類(lèi)型,而可直接使用。
? 例:?
? >>> x=12 #給變量x 賦值?
? >>> y=12.34 #給變量y 賦值?
? >>> z='Hello World' #給變量z 賦值?
? >>> print(x,y,z)?
? 12 12.34 Hello World
? 可以使用Python 內(nèi)置函數(shù)type()來(lái)查詢(xún)變量的類(lèi)型。?
? 例:?
? >>> type(x) #查看x 的數(shù)據(jù)類(lèi)型,x 是整型(int)變量
? (class 'int')?
? >>> type(y) #查看y 的數(shù)據(jù)類(lèi)型,y 是浮點(diǎn)型(float) 變量
? (class 'float')?
? >>> type(z) #查看z 的數(shù)據(jù)類(lèi)型,z 是字符串型(string) 變量?
? (class 'str')
(2)變量與地址的關(guān)系?
? 在C 語(yǔ)言中,編譯系統(tǒng)要為變量分配內(nèi)存空間, 當(dāng)改變變量的值時(shí),改變的是該內(nèi)存空間的內(nèi)容, 在程序運(yùn)行過(guò)程中,變量的地址是不再發(fā)生改變的,即變量所對(duì)應(yīng)的內(nèi)存空間是固定的。?
? Python 語(yǔ)言則不同,它采用的是基于值的內(nèi)存管理方式,不同的值分配不同的內(nèi)存空間。? 當(dāng)給變量賦值時(shí),Python解釋器為該值分配一個(gè) 內(nèi)存空間,而變量則指向這個(gè)空間,當(dāng)變量的值 被改變時(shí),改變的并不是該內(nèi)存空間的內(nèi)容,而 是改變了變量的指向關(guān)系,使變量指向另一內(nèi)存 空間。?
? 這可理解為,Python 變量并不是某一個(gè)固定內(nèi)存 單元的標(biāo)識(shí),而是對(duì)內(nèi)存中存儲(chǔ)的某個(gè)數(shù)據(jù)的引 用(reference),這個(gè)引用是可以動(dòng)態(tài)改變的。
? 例:執(zhí)行下面的賦值語(yǔ)句后,Python 在內(nèi)存中創(chuàng)建數(shù)據(jù)12,并 使變量x 指向這個(gè)整型數(shù)據(jù),因此可以說(shuō)變量x 現(xiàn)在是整型數(shù)據(jù)。?
? >>> x=12 ? >>> print(x)?
? 12?
? 如果進(jìn)一步執(zhí)行下面的賦值語(yǔ)句,則Python 又在內(nèi)存中創(chuàng)建數(shù) 據(jù)3.14,并使變量x 改為指向這個(gè)浮點(diǎn)型(實(shí)型)數(shù)據(jù),因此 變量x 的數(shù)據(jù)類(lèi)型現(xiàn)在變成了浮點(diǎn)型。

? >>> x=3.14?
? >>> print(x)?
? 3.14
? Python 具有自動(dòng)內(nèi)存管理功能,對(duì)于沒(méi)有任何變 量指向的值(稱(chēng)為垃圾數(shù)據(jù)),Python 系統(tǒng)會(huì)自 動(dòng)將其刪除。
? 例:當(dāng)x 從指向12 轉(zhuǎn)而指向3.14 后,數(shù)據(jù)12 就變 成了沒(méi)有被變量引用的垃圾數(shù)據(jù),Python會(huì)回收 垃圾數(shù)據(jù)的內(nèi)存單元,以便提供給別的數(shù)據(jù)使用, 這稱(chēng)為垃圾回收(garbage collection)。
? 也可以使用del 語(yǔ)句刪除一些對(duì)象引用。?
? 例:
? del x?
? 刪除x 變量后,如果再使用它,將出現(xiàn)變量未定義錯(cuò)(name 'x' is not defined)。
? Python 的id()函數(shù)可以返回對(duì)象的內(nèi)存地址。?
? >>> a=2.0
? >>> b=2.0?
? >>> id(a)?
? 35433824?
? >>> id(b)
? 35853488?
? >>> a=2?
? >>> b=2?
? >>> id(a)?
? 1600796448?
? >>> id(b)?
? 1600796448
? Python 解釋器會(huì)為每個(gè)出現(xiàn)的對(duì)象分配內(nèi)存單元, 即使它們的值相等,也會(huì)這樣。
? 例如,執(zhí)行a=2.0,b=2.0 這兩個(gè)語(yǔ)句時(shí),會(huì)先后 為2.0 這個(gè)float 類(lèi)型對(duì)象分配內(nèi)存單元,然后將a?與b 分別指向這兩個(gè)對(duì)象。所以a 與b 指向的不是同一對(duì)象。
? 為了提高內(nèi)存利用效率,對(duì)于一些簡(jiǎn)單的對(duì)象, 如一些數(shù)值較?。?256~256)的整型(int)對(duì)象, Python 采取重用對(duì)象內(nèi)存的辦法。
? 例:執(zhí)行a=2,b=2 時(shí),由于2 作為簡(jiǎn)單的int 類(lèi)型且數(shù)值小,Python 不會(huì)兩次為其分配內(nèi)存單元,而是只分配一次,然后將a 與b 同時(shí)指向已分配的對(duì)象。
? 如果賦值是較大的數(shù)值,情況就跟前面的一樣了。?
? 例:?
? >>> a=2222?
? >>> b=2222?
? >>> id(a)
? 35853872?
? >>> id(b)?
? 35852800
Python 變量的評(píng)論 (共 條)
