变量作用域 – Python中的全局与局部

今天,我们将深入探讨一个非常重要的概念:变量作用域

你是否曾在一个函数内部定义了一个变量,然后尝试在外部访问它,却遇到了错误?那是作用域问题!

理解局部变量和全局变量之间的区别将帮助你编写干净、无错误的代码。


📦 你将学到什么

  • 变量作用域的含义
  • 局部变量和全局变量之间的区别
  • 作用域如何影响对变量的访问
  • global关键字
  • 现实世界的例子和最佳实践

🔍 什么是作用域?

作用域决定了变量在代码中可以被访问的地方

在Python中,主要有两种类型:

  • 局部作用域:在函数内部声明的变量。
  • 全局作用域:在所有函数外部声明的变量。

🧪 1. 局部变量

函数内部定义的变量是该函数的局部变量。

def greet():
    name = "Alice"
    print("Hello", name)

greet()
print(name)  # ❌ 错误:name未定义

name 仅在 greet() 函数内部存在。尝试在外部访问会导致错误。


🌍 2. 全局变量

在所有函数 外部 定义的变量是 全局 的,可以从脚本的 任何地方 访问。

message = "欢迎!"

def greet():
    print(message)

greet()
print(message)  # ✅ 这可以正常工作

⚠️ 3. 在函数内部修改全局变量

您可以在函数内部读取全局变量,但要修改它们,您需要使用global关键字。

不使用global

count = 0

def increment():
    count += 1  # ❌ 错误:UnboundLocalError

这会导致错误,因为 Python 将 count 视为一个新的 局部 变量。

使用 global

count = 0

def increment():
    global count
    count += 1

increment()
print(count)  # ✅ 1

仅在必要时使用global关键字,因为它可能会使调试变得更加困难。


🎯 真实世界示例:用户会话

# 全局会话
is_logged_in = False

def login():
    global is_logged_in
    is_logged_in = True

def logout():

global is_logged_in
is_logged_in = False

login()
print("用户已登录?", is_logged_in)  # True

🧠 变量解析:LEGB 规则

Python 使用 LEGB 规则来解析变量名:

  • L – 本地:在当前函数内部
  • E – 封闭:在封闭函数中(用于嵌套函数)
  • G – 全局:在脚本的顶层定义
  • B – 内置:由Python自身提供(printlen等)

🧼 最佳实践

  • ✅ 优先使用局部变量以避免副作用
  • ✅ 使用函数参数和返回值进行数据传输
  • ⚠️ 除非绝对必要,避免使用global
  • 🚫 切勿对局部变量和全局变量使用相同的名称(容易混淆!)

今天你学到了:

  • 什么是变量作用域及其重要性
  • 局部变量和全局变量之间的区别
  • global关键字的工作原理
  • 解析变量名称的LEGB规则
  • 为什么使用局部作用域通常更安全

更多