C、Java、Python 的變數有何不同?從「盒子」與「標籤」開始理解
學習程式設計時,我們常把變數想成「裝資料的盒子」。這個比喻對 C 與 Java 很有幫助,但到了 Python,變數更像是貼在物件上的「名稱標籤」。理解這項差異,就能明白為什麼三種語言的宣告方式不同,也能減少型別轉換、輸入處理及物件操作時的錯誤。
C 的變數偏向「有固定型別的記憶體空間」;Java 的變數存放「基本值或物件參考」;Python 的變數則是「指向物件的名稱」。
一、三種語言快速比較
| 比較項目 | C | Java | Python |
|---|---|---|---|
| 型別系統 | 靜態型別 | 靜態型別 | 動態型別 |
| 使用前是否寫出型別 | 需要 | 需要 | 通常不需要 |
| 同一變數名稱能否改指向不同型別 | 不可以 | 不可以 | 可以 |
| 字串 | 字元陣列或字元指標 | String 物件 | str 物件 |
| 記憶體管理 | 程式設計者負責較多 | 垃圾回收機制 | 自動記憶體管理 |
| 常數寫法 | const | final | 慣例使用全大寫名稱 |
二、變數如何宣告?
C 與 Java 在變數名稱前必須標示型別,編譯器會先檢查資料是否符合規定。
C 語言
int age = 20;
float height = 170.5f;
char grade = 'A';
Java
int age = 20;
double height = 170.5;
String name = "小明";
Python
age = 20
height = 170.5
name = "小明"
Python 不必在變數名稱前寫出型別。當程式執行到指定敘述時,名稱會指向右邊建立的物件。
三、型別可以中途改變嗎?
C 與 Java 的變數一經宣告,型別便固定。以下把整數變數改放字串,編譯時就會出錯。
/* C */
int value = 10;
/* value = "水井村"; 型別錯誤 */
// Java
int number = 10;
// number = "水井村"; 編譯錯誤
Python 的名稱可以重新指向不同型別的物件:
value = 10
value = "水井村"
value = 3.14
value 依序改指向整數、字串與浮點數物件。四、用「盒子」與「標籤」理解變數
- C:像準備一個固定規格的盒子,盒子對應一塊記憶體,只能放適合該型別的資料。
- Java:基本型別變數像盒子;類別型別變數則保存物件的參考。
- Python:變數像名稱標籤,標籤可以改貼到另一個物件上。
a = 10
b = a
a = 20
print(a) # 20
print(b) # 10
一開始,a 與 b 都指向整數物件 10;執行 a = 20 後,只是讓 a 改指向 20,b 仍然指向 10。
五、基本型別與物件參考
Java 特別區分「基本型別」與「參考型別」。例如 int 直接保存整數值,而 String、陣列及自訂類別的變數保存物件參考。Python 中的整數、浮點數、字串與串列等資料都是物件,變數名稱皆與物件建立關聯。
// Java:一個基本型別、一個物件參考
int score = 90;
String place = "水井村";
# Python:名稱分別指向不同物件
score = 90
place = "水井村"
六、常數的表示方式
/* C */
const double PI = 3.14159;
// Java
final double PI = 3.14159;
# Python:全大寫是一種命名慣例,語法並未禁止修改
PI = 3.14159
C 的 const 與 Java 的 final 可以限制重新指定;Python 通常以全大寫提醒程式設計者「這個值不應任意修改」。
七、型別轉換與除法陷阱
/* C */
double result = (double)5 / 2;
// Java
double result = (double) 5 / 2;
# Python
result = float(5) / 2
在 C 與 Java 中,若兩邊都是整數,5 / 2 會先進行整數除法,結果是 2;只要先把其中一個運算元轉為浮點數,結果才會是 2.5。Python 3 的 / 會得到 2.5,而 // 才是整除。
八、Python 初學者最常遇到的輸入問題
Python 的 input() 所取得的資料一律是字串。若要計算,必須先轉為數值型別。
age = input("請輸入年齡:")
print(type(age)) # <class 'str'>
age = int(age)
print(f"明年是 {age + 1} 歲")
若直接寫成 age + 1,就會變成「字串與整數相加」,Python 因而產生型別錯誤。
九、智慧生活情境範例:環境感測資料
假設系統接收到溫度感測器的資料,三種語言都需要清楚知道資料的型別,才能正確進行判斷、運算與上傳。
# Python 範例
location = "水井村智慧養殖池"
temperature = 28.6
device_count = 7
is_online = True
print(f"場域:{location}")
print(f"水溫:{temperature} °C")
print(f"設備數:{device_count}")
print(f"連線狀態:{is_online}")
其中 location 是字串、temperature 是浮點數、device_count 是整數、is_online 是布林值。即使 Python 不要求事先宣告,程式設計者仍應掌握每項資料的意義與型別。
十、課堂練習
- 分別用 C、Java 與 Python 宣告姓名、年齡及身高。
- 預測 Python 程式
x = 5; y = x; x = 8執行後,x與y的結果。 - 說明為什麼
input()取得的年齡不能直接加 1。 - 為一個智慧農業情境設計四個變數,至少包含字串、整數、浮點數與布林值。
結語
C 重視記憶體與型別控制,Java兼顧型別安全與物件導向,Python 則以簡潔、動態的名稱綁定提高開發效率。
Python 看似不用宣告型別,並不代表型別不重要。相反地,當資料來自鍵盤、感測器、API 或雲端資料庫時,正確理解型別,正是把資料轉化為智慧生活應用的第一步。
沒有留言:
張貼留言