發(fā)布于:2021-02-01 14:59:20
0
183
0
在上一篇關(guān)于Python基本數(shù)據(jù)類型的教程中,您看到了如何創(chuàng)建各種Python數(shù)據(jù)類型的值。但到目前為止,所有顯示的值都是文本值或常量值:
>>> print(5.3)
5.3
如果您正在編寫更復(fù)雜的代碼,那么您的程序?qū)⑿枰S著程序執(zhí)行的進(jìn)行而改變的數(shù)據(jù)。
您將在本教程中學(xué)習(xí)到:您將學(xué)習(xí)如何用抽象術(shù)語對(duì)象來描述Python程序中的每一項(xiàng)數(shù)據(jù),以及如何使用名為變量的符號(hào)名稱來操作對(duì)象。
變量賦值
將變量視為附加到特定對(duì)象的名稱。在Python中,變量不需要像許多其他編程語言那樣預(yù)先聲明或定義。要?jiǎng)?chuàng)建一個(gè)變量,只需給它賦值,然后開始使用它。賦值用一個(gè)等號(hào)(=
)完成:
>>> n = 300
這被讀取或解釋為“n
被賦值300
”,一旦這樣做,n
可以用在語句或表達(dá)式中,其值將被替換:
>>> print(n)
300
就像文本值可以在REPL會(huì)話中直接從解釋器提示符顯示一樣,無需print()
,變量也可以:
>>> n
300
稍后,如果您更改n
的值并再次使用它,新值將被替換:
>>> n = 1000
>>> print(n)
1000
>>> n
1000
Python還允許鏈?zhǔn)劫x值,這使得可以同時(shí)將相同的值賦給多個(gè)變量:
>>> a = b = c = 300
>>> print(a, b, c)
300 300 300
上面的鏈?zhǔn)劫x值將300
賦給變量a
、b
和c
同時(shí)進(jìn)行。
Python中的變量類型
在許多編程語言中,變量是靜態(tài)類型的。這意味著變量最初被聲明為具有特定的數(shù)據(jù)類型,并且在其生存期內(nèi)分配給它的任何值都必須始終具有該類型。
Python中的變量不受此限制。在Python中,可以為變量分配一種類型的值,然后再重新分配另一種類型的值:
>>> var = 23.5
>>> print(var)
23.5
>>> var = "Now I'm a string"
>>> print(var)
Now I'm a string
對(duì)象引用
進(jìn)行變量賦值時(shí)實(shí)際發(fā)生了什么?這是Python中的一個(gè)重要問題,因?yàn)榇鸢概c許多其他編程語言中的答案有些不同。
Python是一種高度面向?qū)ο蟮恼Z言。事實(shí)上,Python程序中幾乎所有的數(shù)據(jù)項(xiàng)都是特定類型或類的對(duì)象。(這一點(diǎn)將在這些教程中多次重復(fù)。)
考慮以下代碼:
>>> print(300)
300
當(dāng)呈現(xiàn)語句時(shí),解釋器執(zhí)行以下操作:
創(chuàng)建整數(shù)對(duì)象
給它值300
顯示它在控制臺(tái)中
您可以看到使用內(nèi)置的函數(shù)創(chuàng)建了一個(gè)整數(shù)對(duì)象:
>>> type(300)
Python變量是一個(gè)符號(hào)名,是指向?qū)ο蟮囊没蛑羔?。一旦一個(gè)對(duì)象被指定給一個(gè)變量,你就可以用這個(gè)名字來引用這個(gè)對(duì)象。但是數(shù)據(jù)本身仍然包含在對(duì)象中。
例如:
>>> n = 300
此賦值創(chuàng)建一個(gè)值為300
的整數(shù)對(duì)象,并指定變量n
指向該對(duì)象。
下面的代碼驗(yàn)證是否n指向整數(shù)對(duì)象:
>>> print(n)
300
>>> type(n)
<class 'int'>
現(xiàn)在考慮以下語句:
>>> m = n
執(zhí)行它會(huì)發(fā)生什么?Python不會(huì)創(chuàng)建另一個(gè)對(duì)象。它只是創(chuàng)建一個(gè)新的符號(hào)名稱或引用m,它指向指向的同一對(duì)象n。
接下來,假設(shè)您這樣做:
>>> m = 400
現(xiàn)在,Python使用value創(chuàng)建一個(gè)新的整數(shù)對(duì)象400,并m成為對(duì)其的引用。
最后,假設(shè)此語句接下來執(zhí)行:
>>> n = "foo"
現(xiàn)在,Python使用該值創(chuàng)建一個(gè)字符串對(duì)象,"foo"并對(duì)其進(jìn)行n引用。
不再有對(duì)整數(shù)對(duì)象的引用300。它是孤立的,無法訪問它。
本系列中的教程有時(shí)會(huì)提到對(duì)象的生命周期。對(duì)象的生命始于創(chuàng)建之時(shí),這時(shí)至少創(chuàng)建了對(duì)其的一個(gè)引用。如上所見,在對(duì)象的生存期內(nèi),可能會(huì)創(chuàng)建對(duì)該對(duì)象的其他引用,并且對(duì)它的引用也會(huì)被刪除。只要有至少一個(gè)引用,一個(gè)對(duì)象就可以保持原樣。
當(dāng)對(duì)一個(gè)對(duì)象的引用數(shù)降至零時(shí),將無法再訪問該對(duì)象。到那時(shí),它的壽命結(jié)束了。Python最終將注意到它不可訪問,并回收分配的內(nèi)存,以便將其用于其他用途。在計(jì)算機(jī)術(shù)語中,此過程稱為垃圾收集。
對(duì)象標(biāo)識(shí)
在Python中,創(chuàng)建的每個(gè)對(duì)象都有一個(gè)唯一標(biāo)識(shí)它的數(shù)字。在生命周期重疊的任何時(shí)期,保證沒有兩個(gè)對(duì)象具有相同的標(biāo)識(shí)符。一旦一個(gè)對(duì)象的引用計(jì)數(shù)降到零并且被垃圾收集,就像上面的300
對(duì)象一樣,那么它的標(biāo)識(shí)號(hào)就變?yōu)榭捎茫⑶铱梢栽俅问褂谩?/span>
內(nèi)置的Python函數(shù)id()
返回一個(gè)對(duì)象的整數(shù)標(biāo)識(shí)符。使用id()
函數(shù),您可以驗(yàn)證兩個(gè)變量確實(shí)指向同一對(duì)象:
>>> n = 300
>>> m = n
>>> id(n)
60127840
>>> id(m)
60127840
>>> m = 400
>>> id(m)
60127872
賦值后m = n
,m
和n
都指向同一對(duì)象,由id(m)
和id(n)
返回相同數(shù)字的事實(shí)確認(rèn)。一旦m
被重新分配到400
,m
和n
指向具有不同標(biāo)識(shí)的不同對(duì)象。
深入:緩存小整數(shù)值
根據(jù)您現(xiàn)在對(duì)Python中變量賦值和對(duì)象引用的了解,下面的內(nèi)容可能不會(huì)讓您感到驚訝:
>>> m = 300
>>> n = 300
>>> id(m)
60062304
>>> id(n)
60062896
通過語句m = 300
,Python創(chuàng)建了一個(gè)值為300
的整數(shù)對(duì)象,并將m
設(shè)置為對(duì)它的引用。然后將n
類似地分配給值為300
的整數(shù)對(duì)象,但不是相同的對(duì)象。因此,它們具有不同的標(biāo)識(shí),您可以通過id()。
返回的值來驗(yàn)證這些標(biāo)識(shí),但請(qǐng)考慮以下情況:
>>> m = 30
>>> n = 30
>>> id(m)
1405569120
>>> id(n)
1405569120
這里,m
和n
分別分配給值為30
的整數(shù)對(duì)象。但在這種情況下,id(m)
和id(n)
是相同的!
為了優(yōu)化,解釋器在啟動(dòng)時(shí)為[-5, 256]
范圍內(nèi)的整數(shù)創(chuàng)建對(duì)象,然后在程序執(zhí)行期間重用它們。因此,當(dāng)您將單獨(dú)的變量賦給此范圍內(nèi)的整數(shù)值時(shí),它們實(shí)際上將引用同一對(duì)象。
變量名
到目前為止,您看到的示例使用了簡(jiǎn)短的變量名,如 正式地說,Python中的變量名可以是任意長(zhǎng)度,可以由大小寫字母( 注意:Python3的一個(gè)新增功能是完全支持Unicode,它也允許變量名中使用Unicode字符。在以后的教程中,您將更深入地了解Unicode。 例如,以下所有變量名都是有效的: >>> name = "Bob" 但是這個(gè)不是,因?yàn)樽兞棵荒芤詳?shù)字開頭: >>> 1099_filed = False 請(qǐng)注意,大小寫非常重要。小寫字母和大寫字母不一樣。下劃線字符的使用也很重要。以下每一項(xiàng)都定義了一個(gè)不同的變量: >>> age = 1 沒有什么可以阻止您在同一個(gè)程序中創(chuàng)建兩個(gè)不同的變量,即 給一個(gè)變量起一個(gè)足夠描述性的名字是值得的,這樣可以清楚地說明它的用途。例如,假設(shè)你正在統(tǒng)計(jì)大學(xué)畢業(yè)的人數(shù)。您可以選擇以下任一選項(xiàng): >>> numberofcollegegraduates = 2500 所有這些選項(xiàng)都可能比 另一方面,它們不一定都是同樣易讀的。與許多事情一樣,這是個(gè)人喜好的問題,但大多數(shù)人會(huì)發(fā)現(xiàn)前兩個(gè)例子,字母都擠在一起,更難閱讀,尤其是所有大寫字母中的那一個(gè)。最常用的構(gòu)造多詞變量名的方法是最后三個(gè)示例: 駝峰大小寫:第二個(gè)和隨后的單詞都大寫,以便于查看單詞邊界。(據(jù)推測(cè),有人在某個(gè)時(shí)候突然想到,散布在變量名中的大寫字母有點(diǎn)像駝峰。) 例如: Pascal Case:與camel Case相同,除了第一個(gè)單詞也是大寫的以外。 示例: 蛇形格:單詞之間用下劃線隔開。 示例: 程序員們以驚人的熱情進(jìn)行了激烈的辯論,到底哪一個(gè)更好??梢詾樗麄兯腥颂岢龊侠淼恼摀?jù)。使用這三個(gè)中最吸引你的一個(gè)。選擇一個(gè)并始終如一地使用它。 稍后您將看到,變量并不是唯一可以命名的東西。您還可以命名函數(shù)、類、模塊等。適用于變量名的規(guī)則也適用于標(biāo)識(shí)符,標(biāo)識(shí)符是程序?qū)ο竺Q的更通用術(shù)語。 Python代碼的樣式指南,也稱為pep8,包含命名約定,列出了不同對(duì)象類型名稱的建議標(biāo)準(zhǔn)。pep8包含以下建議: 函數(shù)和變量名應(yīng)使用Snake Case。 類名應(yīng)使用Pascal Case。(PEP 8將此稱為“大寫”約定。) 保留字(關(guān)鍵字) 標(biāo)識(shí)符名稱還有一個(gè)限制。Python語言保留了一小組指定特殊語言功能的關(guān)鍵字。任何對(duì)象都不能與保留字同名。 在Python3.6中,有33個(gè)保留關(guān)鍵字: 您可以通過輸入help("keywords")Python解釋器隨時(shí)查看此列表。保留字區(qū)分大小寫,必須完全按照所示使用。除,和外False,它們?nèi)繛樾懽帜浮?/p> 嘗試創(chuàng)建與任何保留字同名的變量會(huì)導(dǎo)致錯(cuò)誤: >>> for = 3 結(jié)論 本教程介紹了Python變量的基礎(chǔ)知識(shí),包括對(duì)象引用和標(biāo)識(shí)以及Python標(biāo)識(shí)符的命名。 您現(xiàn)在已經(jīng)對(duì)Python的某些數(shù)據(jù)類型有了很好的了解,并且知道如何創(chuàng)建引用這些類型的對(duì)象的變量。 接下來,您將看到如何將數(shù)據(jù)對(duì)象組合成涉及各種操作的表達(dá)式。m
和n
。但是變量名可能更冗長(zhǎng)。事實(shí)上,這樣做通常是有益的,因?yàn)檫@樣可以使變量的用途乍一看更加明顯。A-Z
、a-z
)、數(shù)字(0-9
)和下劃線字符(_
). 另一個(gè)限制是,盡管變量名可以包含數(shù)字,但變量名的第一個(gè)字符不能是數(shù)字。
>>> Age = 54
>>> has_W2 = True
>>> print(name, Age, has_W2)
Bob 54 True
SyntaxError: invalid token
>>> Age = 2
>>> aGe = 3
>>> AGE = 4
>>> a_g_e = 5
>>> _age = 6
>>> age_ = 7
>>> _AGE_ = 8
>>> print(age, Age, aGe, AGE, a_g_e, _age, age_, _AGE_)
1 2 3 4 5 6 7 8age
和Age
,或者就此而言agE
。但這可能是不明智的。當(dāng)你離開你的代碼一段時(shí)間后,它很可能會(huì)迷惑任何試圖閱讀你的代碼的人,甚至你自己。
>>> NUMBEROFCOLLEGEGRADUATES = 2500
>>> numberOfCollegeGraduates = 2500
>>> NumberOfCollegeGraduates = 2500
>>> number_of_college_graduates = 2500
>>> print(numberofcollegegraduates, NUMBEROFCOLLEGEGRADUATES,
... numberOfCollegeGraduates, NumberOfCollegeGraduates,
... number_of_college_graduates)
2500 2500 2500 2500 2500n
或ncg
等更好。至少你可以從名稱中看出變量的值應(yīng)該代表什么。numberOfCollegeGraduates
NumberOfCollegeGraduates
number_of_college_graduates
SyntaxError: invalid syntax
作者介紹
熱門博客推薦