iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
Software Development

跟著 OXXO 一起學 Python系列 第 2

( Day 2 ) Python 變數 variable

  • 分享至 

  • xImage
  •  

「變數」是什麼?簡單來說,就是一個「內容會改變」的數,舉凡文字、數字、布林值 ( 邏輯 )、陣列...等內容格式,都可以是變數所包含的內容,變數常見於數學公式,例如 xyz 座標、width 寬度或 height 高度,都是一種數字型態的變數。

原文參考:變數 variable

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

認識 Python 的變數

Python 裡的變數,表示的是「某個物件」的「名稱」,當給予某個變數內容時,其實是將內容放入一個物件「容器」中儲存,然後「給予這個物件一個變數名稱」

可以想像成將內容放到一個杯子 ( 容器 ) 裡,接著在這個杯子上貼上標籤 ( 名稱 ),這個貼有標籤的杯子,就是一個「變數」。

舉例來說,下面的程式碼,執行後會印出數字 1。

a = 1
print(a) # 得到結果 1

程式執行順序為:

  • 第一步:將數字 1 放入一個物件容器。
  • 第二步:指定這個物件的名稱為 a ( 變數 a = 1 )。
  • 第三步:印出變數 a 的物件內容。

Python 教學 - 變數 - 認識 Python 的變數

設定多個變數

因為 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 的內容。

Python 教學 - 變數 - 設定多個變數

如果要一次設定多個變數的名稱和內容,可以使用逗號分隔名稱和內容 ( 注意變數的數量要和賦值的數量相同 ),下面的程式,只用了一行就設定了 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 教學 - 變數 - 重新設定變數

交換變數名稱

在其他程式語言裡,如果想要交換兩個變數的值,通常會用另外一個變數暫存要交換的數值,在 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 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 1 ) 認識 Python
下一篇
( Day 3 ) Python 全域變數、區域變數
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
hlb
iT邦新手 5 級 ‧ 2023-11-01 18:44:52

有時候在瀏覽一些程式時,會遇到宣告變數的後方多了一個「逗號」,在變數後方加上逗號,表示「tuple 的型別轉換」,當 tuple 中「只有一個元素」的時候,變數後方加上逗號,就能將元組型別轉換成文字或數字。

這段話感覺有點誤導,加逗號是為了確保它是一個 tuple,而不是做型別轉換。您的範例(例如c2, = a)是從 tuple 中取值。

我要留言

立即登入留言