Python 變量範圍:初學者全方位指南

你好,有抱負的 Pythonista!? 你準備好要深入 Python 變量範圍的迷人世界了嗎?如果這聽起來令人生畏,別擔心;在這個教程結束時,你將成為掌握範圍的大師!讓我們一起踏上這個激動人心的旅程。

Python - Variables Scope

Python 中變量的範圍類型

在我們深入細節之前,先來了解在 Python 中“範圍”意味著什麼。想像你在一個大房子裡,有不同的房間。每個房間都有自己的規則和物品。在 Python 中,這些房間就像不同的範圍,而物品就是我們的變量。

Python 有三種主要的變量範圍:

  1. 局部範圍
  2. 全局範圍
  3. 非局部範圍

讓我們詳細探索每一個。

局部變量

局部變量就像你房間裡的個人物品。它們只能在特定的函數或代碼塊內訪問。

def greet_user():
name = "Alice"  # 這是一個局部變量
print(f"Hello, {name}!")

greet_user()  # 輸出:Hello, Alice!
print(name)  # 這將引發一個 NameError

在這個例子中,namegreet_user() 函數內的局部變量。它就像 Alice 的名牌,只存在於函數的房間內。當我們試圖在函數外部訪問它時,Python 會說:“對不起,我在這外面不認識任何 'name'!”

全局變量

全局變量就像冰箱上貼的房子規則——它們可以在程序中的任何地方訪問。

house_name = "Python Palace"  # 這是一個全局變量

def welcome_message():
print(f"Welcome to {house_name}!")

welcome_message()  # 輸出:Welcome to Python Palace!
print(house_name)  # 輸出:Python Palace

在這裡,house_name是我們的全局變量。它就像我們房子的名字,每個人都能看到並使用,無論他們是在廚房、客廳還是程序中的任何函數。

但是如果我們想在函數內修改全局變量呢?這就是 global 關鍵字派上用場的地方:

counter = 0  # 全局變量

def increment_counter():
global counter
counter += 1
print(f"Counter is now: {counter}")

increment_counter()  # 輸出:Counter is now: 1
increment_counter()  # 輸出:Counter is now: 2

通過使用 global counter,我們告訴 Python:“嘿,我想使用房子的計數器,不是在這個房間創建一個新的!”

非局部變量

現在,想像你在大臥室內的客房裡。你可以訪問客房內的東西(局部範圍)和一部分大臥室的東西(非局部範圍),但不是整個房子的東西(全局範圍)。

def outer_function():
x = "outer"

def inner_function():
nonlocal x
x = "inner"
print("Inner:", x)

inner_function()
print("Outer:", x)

outer_function()
# 輸出:
# Inner: inner
# Outer: inner

在這個嵌套函數場景中,nonlocal x 讓內部函數可以修改外部(包圍)函數中的變量。

Python 變量的命名空間和範圍

將命名空間想像成一個大字典,Python 在這裡保存所有的變量。每個範圍都有自己的命名空間。

x = 10  # 全局命名空間

def outer():
y = 20  # outer() 命名空間

def inner():
z = 30  # inner() 命名空間
print(x, y, z)

inner()

outer()  # 輸出:10 20 30

這個例子展示了 Python 如何在不同命名空間中查找變量,從最內部的範圍向外查找。

Python globals() 函數

globals() 函數就像一面神奇的鏡子,顯示你程序中所有的全局變量。

x = 10
y = "hello"

print(globals())
# 輸出:{..., 'x': 10, 'y': 'hello', ...}

它返回一個包含所有全局變量的字典。這對於調試非常有幫助!

Python locals() 函數

類似地,locals() 顯示你當前範圍內的所有局部變量。

def show_locals():
a = 5
b = "world"
print(locals())

show_locals()
# 輸出:{'a': 5, 'b': 'world'}

這個函數非常適合窺視你當前“房間”中可用的變量。

Python 中的命名空間衝突

有時候,不同範圍中的變量可能會有相同的名字,導致命名空間衝突。Python 使用 LEGB 法則解決這個問題:Local, Enclosing, Global, Built-in。

x = "global"

def outer():
x = "outer"

def inner():
x = "inner"
print("Inner x:", x)

inner()
print("Outer x:", x)

outer()
print("Global x:", x)

# 輸出:
# Inner x: inner
# Outer x: outer
# Global x: global

在這個例子中,每個範圍都有自己的 x,Python 使用最接近調用它的那個。

以下是我們討論過的關鍵函數的總結表:

函數 描述 示例
globals() 返回一個包含全局變量的字典 print(globals())
locals() 返回一個包含局部變量的字典 print(locals())
global 在函數內聲明一個全局變量 global x
nonlocal 在嵌套函數內聲明一個非局部變量 nonlocal y

記住,理解變量範圍就像學習新房子的佈局。一開始可能會感到困惑,但經過練習,你將能夠像專業人士一樣導航這些“房間”!繼續編碼,繼續探索,並且不要猶豫去實驗。畢竟,學習 Python 的最佳方式就是動手去做。快樂編碼!?✨

Credits: Image by storyset