以下是 Python 變量的詳細解析:
1. 變量的本質
Python 變量本質上是一個 指向對象的引用(類似標簽),而不是存儲數據的容器。
- 變量賦值
a = 10
時,Python 會創建一個整數對象10
,然后讓變量a
指向這個對象。 - 變量本身沒有固定類型,類型屬于對象(動態類型特性)。
a = 10 # a 指向整數對象 10
a = "hello" # 現在 a 指向字符串對象 "hello"(合法)
2. 變量的命名規則
- 由字母、數字、下劃線組成,不能以數字開頭。
- 區分大小寫(
var
和Var
不同)。 - 不能使用關鍵字(如
if
,for
,class
)。 - 建議使用小寫字母和下劃線的組合(如
user_name
)。
合法示例:
name = "Alice"
_age = 25
value2 = 3.14
非法示例:
2var = 10 # 以數字開頭
class = "Python" # 使用關鍵字
3. 變量類型
Python 是動態類型語言,變量的類型由指向的對象決定。常見類型:
- 基本類型:
int
,float
,str
,bool
,NoneType
- 容器類型:
list
,tuple
,dict
,set
a = 5 # int
b = 3.14 # float
c = "Hello" # str
d = True # bool
e = [1, 2, 3] # list
f = {"key": "value"} # dict
4. 變量作用域
- 局部變量:在函數內部定義,僅在函數內有效。
- 全局變量:在函數外部定義,全局有效。函數內修改全局變量需用
global
關鍵字。 - 非局部變量:在嵌套函數中使用外層變量時,需用
nonlocal
關鍵字。
x = 10 # 全局變量def func():global xx = 20 # 修改全局變量y = 5 # 局部變量func()
print(x) # 輸出 20
5. 可變對象 vs 不可變對象
- 不可變對象:值不可修改(如
int
,float
,str
,tuple
)。修改變量會創建新對象。 - 可變對象:值可修改(如
list
,dict
,set
)。修改時對象本身變化。
# 不可變示例
a = 10
print(id(a)) # 輸出地址 1
a = 20 # 創建新對象
print(id(a)) # 地址改變# 可變示例
b = [1, 2]
print(id(b)) # 地址 2
b.append(3) # 修改原對象
print(id(b)) # 地址不變
6. 變量賦值與內存管理
- 賦值操作:變量間的賦值是傳遞引用(淺拷貝)。
- 深拷貝:使用
copy.deepcopy()
創建完全獨立的對象。
list1 = [1, 2, 3]
list2 = list1 # list2 和 list1 指向同一對象
list2.append(4)
print(list1) # 輸出 [1, 2, 3, 4]import copy
list3 = copy.deepcopy(list1) # 深拷貝
list3.append(5)
print(list1) # 輸出 [1, 2, 3, 4](原對象未變)
print(list3) #輸出[1, 2, 3, 4, 5]
7. 變量與函數參數
- 不可變對象參數:函數內修改不會影響外部變量。
- 可變對象參數:函數內修改會影響外部變量。
def modify(num, lst):num += 1 # 不影響外部變量lst.append(4) # 修改原對象a = 10
b = [1, 2, 3]
modify(a, b)
print(a) # 輸出 10
print(b) # 輸出 [1, 2, 3, 4]
8. 特殊變量
_
:臨時變量或忽略值(如for _ in range(5)
)。__name__
:模塊的內置屬性,用于判斷是否為主程序入口。
9. 常見問題
- 變量未定義:使用未賦值的變量會觸發
NameError
。 - 類型錯誤:對變量執行不兼容操作(如
str + int
)會觸發TypeError
。 - 意外修改可變對象:多個變量引用同一對象時需謹慎。
總結
Python 變量的核心特點:
- 動態類型:變量類型由對象決定。
- 引用語義:變量是對象的標簽。
- 靈活但需注意可變對象和賦值邏輯。
掌握這些概念能幫助你寫出更高效、健壯的代碼!