- Python從菜鳥到高手(第2版)
- 李寧編著
- 3129字
- 2023-08-10 16:41:19
2.2 變量
下面在helloworld.py中定義并初始化一個變量,在這個文件開頭添加一行代碼,并對第2行代碼進行修改,代碼如下:
msg = 'Hello Python!' print(msg)
運行這段程序,會看到如下的輸出結果:
Hello Python!
你會發現,輸出結果與前面的相同。在這段代碼中,定義了一個名為msg的變量,并為這個變量指定了一個值,這個過程稱為變量的初始化,這個值就是與該變量關聯的信息。如果以后不再為msg變量賦值,那么msg就代表"Hello Python!"。在處理第2行代碼時,print函數會將與msg變量關聯的值打印到屏幕上。
下面擴展這個程序,修改helloworld.py,讓其再打印一行消息。為此,需要在helloworld.py的最后再添加兩行代碼,為了讓代碼更清晰,可以在新添加的兩行代碼前面加一個空行:
msg = 'Hello Python!' print(msg) msg = '我愛Python,我愛《Python從菜鳥到高手》!' print(msg)
現在運行程序,會看到輸出了如下兩行消息:
Hello Python! 我愛Python,我愛《Python從菜鳥到高手》!
在新添加的兩行代碼中的第1行重新設置了msg變量的值,所以最后一行代碼會將msg變量最新的值打印到屏幕上。因此可以得出一個結論,在Python中可以隨時隨地修改變量的值,而每次使用變量時,都會獲得變量最新的值。
2.2.1 變量的定義和初始化

微課視頻
代碼位置:src/basic/var.py
由于Python是動態編程語言(1),所以在定義變量時并不需要事先指定變量的數據類型,變量的定義和初始化是同時進行的。Python解析器會根據初始化值的數據類型動態確定變量的類型。例如,下面有4個變量a、b、c、d,分別為這4個變量設置了不同類型的值,最后的4行代碼使用type函數分別輸出了這4個變量的類型。
a = 40 b = True c = 30.4 d = "I love python" print("a的數據類型:" ,type(a)) print("b的數據類型:" ,type(b)) print("c的數據類型:" ,type(c)) print("d的數據類型:" ,type(d))
運行這段代碼,會輸出如下內容:
a的數據類型: <class 'int'> b的數據類型: <class 'bool'> c的數據類型: <class 'float'> d的數據類型: <class 'str'>
從輸出結果可以看出,在為4個變量賦值時,其實變量已經創建和初始化了,同時確定了變量的數據類型。
在Python中,變量的數據類型是隨時可以改變的,現在擴展這個程序,在var.py最后添加兩行代碼:
a = 40 b = True c = 30.4 d = "I love python" print("a的數據類型:" ,type(a)) print("b的數據類型:" ,type(b)) print("c的數據類型:" ,type(c)) print("d的數據類型:" ,type(d)) d = 20 print("d的數據類型:" ,type(d))
運行這段代碼,會輸出如下內容:
a的數據類型: <class 'int'> b的數據類型: <class 'bool'> c的數據類型: <class 'float'> d的數據類型: <class 'str'> d的數據類型: <class 'int'>
從輸出結果可以看出,變量的數據類型從str變成了int,所以驗證了Python變量的數據類型是隨時可以改變的。
2.2.2 變量的命名
Python中的變量名要遵循一定的規則,如果違反,在運行Python程序時就會引發錯誤(2),而按照這些規則對變量命名,不僅可以避免發生錯誤,還可以讓程序更容易理解。讀者可以參照下面的規則命名Python變量。
· 盡管Python支持Unicode(3),理論上可以使用每個國家的語言作為變量名,如中文、日文、韓文等。但強烈建議不要這樣做。因為這樣做可能會導致亂碼,以及非本語種的人無法閱讀的窘境。通常的做法是變量名只由英文、數字和下畫線組成。如abc、abc_、test_project都是可以被大眾接受的變量名。
· 變量名不能以數字開頭,只能以英文字母或下畫線開頭。如4a、20b是錯誤的變量名,程序會出錯。a4、b20、_20是正確的變量名。
· 不能用某些特殊的字符作為變量名,變量名中也不能包含這些字符。如運算符號(+、0、*、/等)、比較符號(>、=、<等)、邏輯符號(&&、||、!等)都不能包含在變量名中。如a=b、a!都是錯誤的變量名。
· 不能用Python的關鍵字作為變量名,但變量名中可以包含這些關鍵字。如if、while、for都是錯誤的變量名,但ifa、awhile、forxyz是正確的變量名。
· 變量名應該用有意義的名字,除非做簡單的驗證和測試,否則正式的項目最好不要起像a、b、c、d、name這樣的變量名,它們盡管合法,但不容易讓人理解。變量名應該與實際表示的數據相關,例如productName、studentSex、phonePrice都是比較好的變量名。
· 統一變量名的命名規范。變量名的命名規范主要有3種:大駝峰、小駝峰、下畫線分隔。大駝峰是組成變量名的每個英文單詞首字母都大寫,如ProductName;小駝峰與大駝峰類似,只是組成變量名的第1個英文單詞的首字母小寫,其余英文單詞的首字母都大寫,如productName;下畫線分隔是組成變量名的所有英文單詞的所有字母都小寫,多個英文單詞中間用下畫線分隔,如product_name。Python用小駝峰和下畫線分隔的方式比較多,這些命名規范并沒有好壞之分,只要整個項目統一命名規范即可。
· 變量名盡量不要用容易混淆的字符和數字,如1和l, 0和O等,前者是數字1和0,后者是小寫字母l和大寫字母O。如果不仔細看,是很容易混淆的。尤其是其他人看自己寫的程序的情況下更容易弄錯,如a1和al,這兩個變量在word文檔里幾乎是一樣的,在IDE中有細微的差別,但需要仔細看才可以分辨。
2.2.3 避免弄錯變量名
由于Python是動態語言,所以只有在程序運行時才能發現錯誤,其中一個非常容易發生的錯誤就是變量名寫錯了,代碼如下:
message='Hello Python!' print(mesage)
很明顯,第2行代碼將message寫成了mesage,中間少了一個字母s。運行這段程序,就會拋出如圖2-1所示的異常。
當執行到第2行代碼時,Python解析器會盡可能找到mesage變量,但很可惜,沒找到,所以Python解析器就會告知有一個錯誤,并指明錯誤的具體原因,也就是mesage變量沒定義。Python不允許使用一個沒定義的變量。
其實讀者使用PyCharm開發Python程序,這種變量名寫錯的情況一般是可以避免的,如果使用了沒定義的變量名,PyCharm會在變量名下方顯示一個紅色的波浪線,就表明該變量未定義,但下面的情況就不會得到任何提示了,除非程序執行到錯誤行,或自己讀代碼時發現,否則這個錯誤將永遠隱藏在程序中。例如:
al = 20 a1 = "hello world" print(a1+ 30)
執行這段代碼,會拋出如圖2-2所示的異常。

圖2-1 由于變量名錯誤拋出的異常

圖2-2 不容易發現的變量名錯誤
本來第3行是想讓al與30相加的,其中al變量的值是20,是一個整數類型。al變量的第2個字符是小寫的字母l。而第2行的a1變量是字符串類型,a1的第2個字符是數字1。由于l和1非常像,所以將l寫成了1,但在這種情況下,PyCharm是不會給出任何提示的,除非程序運行到第3行,否則是不會拋出任何異常的。
這里先普及一個知識點,在Python中,字符串是不能與數字直接相加的,否則會拋出異常。關于字符串的詳細內容在后面的章節會講解。
其實像前面的這段代碼還好,至少程序在執行到第3行時會拋出異常,只要在測試時覆蓋到這行代碼,就會發現錯誤,但下面的代碼壓根就不會拋出異常,這屬于100%的邏輯錯誤。

執行這段代碼,輸出的是60,但按業務邏輯,期望輸出的是50,就是由于將字母l寫成了數字1,所以導致了邏輯錯誤,但可惜的是,al和a1都是整數類型,所以程序是不會拋出任何異常的。這樣的錯誤極難被發現,所以再強調一點,起變量名時盡可能不要用容易混淆的字符或數字,否則這樣的錯誤在所難免。

圖2-3 變量與小柜子
2.2.4 如何理解變量
盡管大家到現在為止已經學會了如何定義和使用Python變量,但對于初學者來說,對變量的概念可能還是有些模糊。
其實可以將變量想象成超市中存放物品的一個個的小柜子,如圖2-3所示。
變量名相當于每個柜子的號碼,變量中的值相當于柜子中存放的物品。變量的數據類型相當于柜子中可以存放物品的種類,如手機、鞋子、帽子、食品等。變量可以存儲的值的大小就相當于柜子的容量。如太大的物品是無法放進較小的柜子里的(存儲的值超出了變量運行的最大存儲空間,如最大存儲4字節的變量不能保存8字節的數據)。
按照這個比喻,可以很容易理解Python變量到底是怎么回事,讀取變量中的值,就相當于根據柜子的編號找到柜子,并取出柜子中的物品(4),對變量重新賦值,就相當于根據柜子的編號找到柜子,然后向柜子中放入相應的物品。變量可以隨時改變數據類型就相當于可以向柜子中放入任何種類的物品。如果不可以改變變量的數據類型,那么就相當于第1次放入物品,柜子就會自動識別物品的種類,以后就只能放這類物品了。
當然,如果從底層來闡述,柜子的編號(變量)其實相當于內存地址,而柜子中的存儲空間(變量的值)相當于一段內存存儲空間,不過讀者在剛開始學習Python時,并不需要對這些細節有過多的了解,只需要學會使用Python變量即可。
- Spring 5.0 Microservices(Second Edition)
- C++案例趣學
- Xcode 7 Essentials(Second Edition)
- React Native Cookbook
- 區塊鏈:以太坊DApp開發實戰
- Redis Essentials
- Python機器學習基礎教程
- Scala程序員面試算法寶典
- Java語言程序設計教程
- jQuery for Designers Beginner's Guide Second Edition
- 從程序員角度學習數據庫技術(藍橋杯軟件大賽培訓教材-Java方向)
- Flask Web開發:基于Python的Web應用開發實戰(第2版)
- H5+移動營銷設計寶典
- VMware vSphere Design Essentials
- MySQL從入門到精通