作用域小課堂:Python變量的局部與全局作用域

想象一下,你有一個玩具箱,裏面的玩具只能在自己房間(比如你的臥室)裏玩;而客廳裏的玩具(如果有的話),你在臥室也能拿到。在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()

總結:關鍵規則

  1. 局部作用域:函數內部定義的變量,僅在函數內有效。
  2. 全局作用域:函數外定義的變量,整個程序都能訪問。
  3. 修改全局變量:必須用global聲明,否則Python會當成局部變量。
  4. 嵌套函數:內層函數修改外層局部變量,要用nonlocal聲明。

合理使用作用域能讓代碼結構更清晰,避免變量名衝突。多寫幾個小例子測試不同場景,很快就能熟練掌握啦!

小夜