想象一下,你有一個玩具箱,裏面的玩具只能在自己房間(比如你的臥室)裏玩;而客廳裏的玩具(如果有的話),你在臥室也能拿到。在Python中,變量也有類似的“活動範圍”——作用域,它決定了變量能被訪問的範圍。今天我們就來聊聊Python中最常見的兩種作用域:局部作用域和全局作用域。
一、局部作用域:函數里的“小祕密”¶
如果一個變量是在函數內部定義的,那它就只能在這個函數內部被訪問和修改,就像你藏在抽屜裏的玩具,只有在抽屜所在的房間(函數內部)才能“拿出來玩”。這就是局部作用域(Local Scope)。
舉個例子:
# 定義一個函數,函數內部有局部變量
def my_function():
age = 18 # age是局部變量,只在my_function裏有效
print("函數內部:", age) # 可以正常打印
my_function() # 輸出:函數內部: 18
print("函數外部:", age) # 報錯!因爲age是局部變量,外面找不到
如果在函數內部定義了一個和全局變量同名的局部變量,Python會優先把它當作“局部的”,而不是全局的。比如:
x = 100 # 全局變量x
def my_function():
x = 200 # 這裏x是局部變量,覆蓋了全局的x
print("函數內部x:", x) # 輸出:200
my_function()
print("函數外部x:", x) # 輸出:100(全局x沒被修改)
二、全局作用域:程序裏的“大玩具”¶
如果一個變量是在所有函數外面定義的,那它就是全局變量(Global Scope),整個程序的任何地方都能訪問它,就像你放在客廳的大玩具箱,全家都能拿到。
直接訪問全局變量:
name = "小明" # 全局變量,所有地方都能訪問
def say_hello():
print("你好," + name) # 可以直接用全局變量name
say_hello() # 輸出:你好,小明
print(name) # 輸出:小明
修改全局變量的坑:
在函數內部直接修改全局變量會報錯嗎?不,Python會“誤會”你要創建一個局部變量。比如:
score = 80 # 全局變量
def update_score():
score = 90 # 這裏Python會認爲是新的局部變量,而不是修改全局
print("函數內部score:", score) # 輸出:90
update_score()
print("函數外部score:", score) # 輸出:80(全局score沒變!)
正確修改全局變量:要在函數內部用global關鍵字告訴Python“我要修改的是全局變量,不是局部的”。
score = 80
def update_score():
global score # 聲明:score是全局變量,要修改它
score = 90
print("函數內部score:", score) # 輸出:90
update_score()
print("函數外部score:", score) # 輸出:90(全局score被修改了)
三、進階:嵌套函數與nonlocal(瞭解即可)¶
如果函數內部又定義了另一個函數(嵌套函數),內層函數可以訪問外層函數的局部變量,但如果想修改外層函數的局部變量,需要用nonlocal關鍵字。
例子:
def outer_function():
outer_var = "外層變量" # outer_var是outer的局部變量,也是inner的“非局部變量”
def inner_function():
nonlocal outer_var # 聲明:修改outer_var的是外層函數的局部變量
outer_var = "被修改的外層變量"
print("內層函數內部outer_var:", outer_var) # 輸出:被修改的外層變量
inner_function()
print("外層函數內部outer_var:", outer_var) # 輸出:被修改的外層變量
outer_function()
總結:關鍵規則¶
- 局部作用域:函數內部定義的變量,僅在函數內有效。
- 全局作用域:函數外定義的變量,整個程序都能訪問。
- 修改全局變量:必須用
global聲明,否則Python會當成局部變量。 - 嵌套函數:內層函數修改外層局部變量,要用
nonlocal聲明。
合理使用作用域能讓代碼結構更清晰,避免變量名衝突。多寫幾個小例子測試不同場景,很快就能熟練掌握啦!