掌握 Python 作用域規(guī)則的四個核心要點
在Python編程中,作用域是一個非常重要的概念。它規(guī)定了變量可以在哪里使用、以及它的生命周期。如果你對作用域不熟悉,可能會遇到很多讓人頭疼的問題。今天我們就一起聊聊Python作用域規(guī)則的4個核心要點。
核心要點1:全局作用域
我們先從最簡單的開始,什么是全局作用域呢?簡單來說,就是代碼里任何地方都能訪問到的變量。
# 定義一個全局變量
global_variable = "我是一個全局變量"
def my_function():
print(global_variable) # 在函數(shù)內(nèi)部訪問全局變量
my_function() # 輸出: 我是一個全局變量
這段代碼首先定義了一個全局變量global_variable。之后,在函數(shù)my_function()內(nèi)部訪問這個變量并打印出來。可以看到,在函數(shù)內(nèi)直接使用全局變量是沒有問題的。
核心要點2:局部作用域
再來看看局部作用域。局部作用域里的變量只能在它們所在的代碼塊內(nèi)(如函數(shù)或類)被使用。
def local_function():
local_variable = "我是局部變量"
print(local_variable)
local_function() # 輸出: 我是局部變量
print(local_variable) # 報錯!NameError: name 'local_variable' is not defined
在這里,local_variable是在local_function()內(nèi)定義的局部變量。當(dāng)你嘗試在函數(shù)外訪問它時,Python會報錯,因為這個變量只存在于它的作用域范圍內(nèi)。
核心要點3:LEGB規(guī)則
Python遵循所謂的LEGB規(guī)則,這是用來查找變量名字綁定的地方。這四個字母分別代表什么?
- L(Local):局部作用域
- E(Enclosing):嵌套作用域(閉包)
- G(Global):全局作用域
- B(Built-in):內(nèi)置作用域
舉個例子來幫助理解。
x = "global" # 全局變量
def outer():
x = "enclosing" # 外層作用域內(nèi)的局部變量
def inner():
x = "local" # 局部變量
print(x)
inner()
outer() # 輸出: local
在這個示例中,inner()函數(shù)里面的print(x)會找到最近的作用域中的x變量,這里是inner()自己的“l(fā)ocal”。所以最終輸出的是local。
核心要點4:使用global和nonlocal聲明改變變量綁定
最后一點要講的就是怎么在一個函數(shù)里面更改外部的變量值。
(1) 使用global
如果想在函數(shù)內(nèi)部修改全局變量,就要用global關(guān)鍵字。
number = 0
def modify_global():
global number
number += 1
modify_global()
print(number) # 輸出:1
在這個例子中,函數(shù)modify_global利用global關(guān)鍵字使得它可以增加全局變量number的值。
(2) 使用nonlocal
當(dāng)在內(nèi)嵌函數(shù)中要修改外層函數(shù)中的變量時,可以使用nonlocal關(guān)鍵字。
def counter():
count = 0 # 外層作用域變量
def increment():
nonlocal count # 聲明為非本地作用域變量
count += 1
return count
return increment
increment_counter = counter()
print(increment_counter()) # 輸出: 1
print(increment_counter()) # 輸出: 2
這個例子展示了一個閉包的應(yīng)用場景,其中increment()通過nonlocal聲明來修改外層函數(shù)counter中的變量count。
實戰(zhàn)案例
下面我們結(jié)合實際場景來練習(xí)下所學(xué)的知識點。假設(shè)你需要編寫一個計算器,用戶輸入表達式時能識別變量并計算結(jié)果。
memory = {} # 用來保存用戶的變量定義
def evaluate_expression(expr):
try:
return eval(expr, globals(), memory)
except Exception as e:
return str(e)
def calculator():
while True:
expr = input("Enter an expression (or 'exit' to quit): ")
if expr.lower() == 'exit':
break
result = evaluate_expression(expr)
if isinstance(result, float):
result = round(result, 4) # 限制浮點數(shù)顯示精度
print(f"Result: {result}")
# 運行計算器
calculator()
在這個實戰(zhàn)案例中,我們創(chuàng)建了一個交互式環(huán)境讓用戶定義他們自己的變量(這些變量存在字典memory中),同時也能進行常規(guī)數(shù)學(xué)運算。比如輸入x=5;y=10;x+y將會輸出結(jié)果15。這里eval()函數(shù)允許從一個字符串解析表達式,并根據(jù)傳入的全局變量字典(這里未傳額外)以及存儲自定義變量的memory字典執(zhí)行它。
總結(jié)
本文詳細講解了Python作用域的四個核心要點:
- 全局作用域讓變量可被任何地方訪問。
- 局部作用域限定變量僅能在其定義的代碼塊內(nèi)有效。
- LEGB規(guī)則解釋變量搜索的順序:從本地出發(fā)逐級向外尋找。
- 使用global和nonlocal聲明改變變量綁定。