「變數」是什麼?簡單來說,就是一個「內容會改變」的數,舉凡文字、數字、布林值 ( 邏輯 )、陣列...等內容格式,都可以是變數所包含的內容,變數常見於數學公式,例如 xyz 座標、width 寬度或 height 高度,都是一種數字型態的變數。
原文參考:變數 variable
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
Python 裡的變數,表示的是「某個物件」的「名稱」,當給予某個變數內容時,其實是將內容放入一個物件「容器」中儲存,然後「給予這個物件一個變數名稱」。
可以想像成將內容放到一個杯子 ( 容器 ) 裡,接著在這個杯子上貼上標籤 ( 名稱 ),這個貼有標籤的杯子,就是一個「變數」。
舉例來說,下面的程式碼,執行後會印出數字 1。
a = 1
print(a) # 得到結果 1
程式執行順序為:
- 第一步:將數字 1 放入一個物件容器。
- 第二步:指定這個物件的名稱為 a ( 變數 a = 1 )。
- 第三步:印出變數 a 的物件內容。
因為 Python 變數的特性,同樣一個物件可以賦予多個變數名稱,下面的程式碼,執行後,變數 a、b、c 都會是 1。
就像一個杯子上面,貼了各種不同標籤。
a = 1
b = c = a
print(a) # 得到結果 1
print(b) # 得到結果 1
print(c) # 得到結果 1
程式執行順序為:
- 第一步:將數字 1 放入一個物件容器。
- 第二步:指定這個物件的名稱為 a ( 變數 a = 1 )。
- 第三步:讓這個物件名稱也有 b 和 c。
- 第四步:印出變數 a、b、c 的內容。
如果要一次設定多個變數的名稱和內容,可以使用逗號分隔名稱和內容 ( 注意變數的數量要和賦值的數量相同 ),下面的程式,只用了一行就設定了 a、b、c 三變數。
a, b, c = 1, 2, 3
print(a) # 1
print(b) # 2
print(c) # 3
如果變數的內容是串列、字典或集合,在處理「多個變數同時賦值」時容易會遇到陷阱,因為變數只是「標籤」,當多個變數同時指向一個串列、字典或集合時,只要變數內容被修改 ( 並非使用等號賦值 ),不論這個變數是全域還是區域變數,另外一個變數內容也會跟著更動。
下方例子的變數 a 使用 append 的方式「修改」串列內容,就會造成 a 和 b 的內容同時被修改,但如果 c 是使用等號再次「宣告賦值」,c 和 d 就會指向不同的內容。
a = []
b = a
a.append(1)
print(a) # [1]
print(b) # [1] # 被影響
c = []
d = c
c = [1]
print(c) # [1]
print(d) # [] # 不受影響
同樣的原理也可以應用在會被「全域變數和區域變數」影響的函式,下方的例子執行後,f1 函式的 a 不受作用域的影響,使用 append 發生「改變」後,不論 a 在何處都會被影響,連帶 b 也被影響,但 c 因為是使用等號「宣告賦值」,就會轉變成「區域變數」,因此在 f1 函式作用域之外的 c 就不會被影響,d 也不會被影響。
a = []
b = a
c = []
d = c
def f1():
a.append(1)
c = [1]
print(a) # [1]
print(b) # [1] # 被影響
print(c) # [1]
print(d) # [] # 不受影響
def f2():
print(a) # [1] # 被影響
print(b) # [1] # 被影響
print(c) # [] # 不受影響
print(d) # [] # 不受影響
f1()
f2()
在同一層的程式裡,變數名稱都是不會重複的,如果重複使用了變數名稱,則會將名稱指派給另外一個物件,下面的程式碼,執行後會印出數字 2 和 1。
就像從一個杯子上撕下標籤,貼到另外一個杯子上。
a = 1
b = a
a = 2
print(a) # 得到結果 2
print(b) # 得到結果 1
執行順序為:
- 第一步:將數字 1 放入一個物件容器。
- 第二步:指定這個物件的名稱為 a ( 變數 a = 1 )。
- 第三步:讓指定名稱為 a 的物件也有另外一個名稱 b ( 變數 b = 變數 a )。
- 第四步:將數字 2 放入一個物件容器,指定這個物件的名稱為 a ( 將標籤 a 從數字 1 的盒子上撕下來,貼到數字 2 的盒子上 )。
- 第五步:印出變數 a 和名稱 b 的物件內容。
在其他程式語言裡,如果想要交換兩個變數的值,通常會用另外一個變數暫存要交換的數值,在 Python 裡可以一次進行多個變數的交換名稱,下方的例子會將 a、b、c 的數值換成 b、c、a。
a = 1
b = 2
c = 3
print(a, b, c) # 1, 2, 3
a, b, c = b, c, a # 交換內容
print(a, b, c) # 2, 3, 1
同理,如果在變數賦值時,有變數的內容有做運算,同樣會按照交換變數名稱的方法,以當下的變數內容為主,下方的例子雖然按起來很類似,但因為 a 和 b 使用交換變數名稱的方式,因此 a+b 運算時 a 等於 1,而 c 和 d 是按照順序賦值,所以 c+d 時 c 的內容已經改變了。
a = 1
b = 2
a, b = b, a+b
print(a, b) # 2, 3
c = 1
d = 2
c = d
d = c + d
print(c, d) # 2, 4
有時候在瀏覽一些程式時,會遇到宣告變數的後方多了一個「逗號」,在變數後方加上逗號,表示「tuple 的型別轉換」,當 tuple 中「只有一個元素」的時候,變數後方加上逗號,就能將元組型別轉換成文字或數字。
a = (1,)
b = ('b',)
c1 = a
c2, = a # 宣告時加上逗號
d1 = b
d2, = b # 宣告時加上逗號
print(c1) # (1,) # 還是 tuple
print(c2) # 1 # 變成數字
print(d1) # ('b',) # 還是 tuple
print(d2) # b # 變成文字
幫變數命名的時候,需要把握一個重點:「看到變數的名稱,就知道是儲存什麼資料」,因此變數名稱如果取得不好,程式就會難以理解,Python 官方網站提供了以下幾個變數名稱的建議:
- 建議使用小寫英文字母,例如 score。如果需要組合多個英文單字,可以在單字之間加上底線,例如:english_score。
- 如果變數的內容不要被修改( 其他程式語言稱為「常數」,也就是內容不會改變的數 ),變數名稱建議全部用大寫英文字母,例如 MAX_NUMBER。
- 如果變數名稱包含專有名詞,例如 HTTP、APP,就使用原來的大小寫格式,例如 HTTP_port、APP_port。
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^
有時候在瀏覽一些程式時,會遇到宣告變數的後方多了一個「逗號」,在變數後方加上逗號,表示「tuple 的型別轉換」,當 tuple 中「只有一個元素」的時候,變數後方加上逗號,就能將元組型別轉換成文字或數字。
這段話感覺有點誤導,加逗號是為了確保它是一個 tuple,而不是做型別轉換。您的範例(例如c2, = a
)是從 tuple 中取值。