程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

Python教程(十三):变量作用域(python中变量作用域)

hfteth 2025-07-21 14:02:42 技术文章 2 ℃

您是否曾经在函数内部定义了一个变量,然后试图在外部访问它 — 结果却得到了一个错误?这就是作用域问题!

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


今天您将学习什么

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

什么是作用域?

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

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

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

1. 局部变量

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

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

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

name只存在于greet()函数内部。试图在外部访问它会导致错误。


2. 全局变量

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

message = "Welcome!"

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 – Local(局部):在当前函数内部
  • E – Enclosing(封闭):在封闭函数中(用于嵌套函数)
  • G – Global(全局):在脚本的顶层定义
  • B – Built-in(内置):由Python本身提供(printlen等)

最佳实践

  • 优先使用局部变量以避免副作用
  • 使用函数参数和返回值进行数据传输
  • 除非绝对必要,否则避免使用global
  • 永远不要对局部和全局变量使用相同的名称(会混淆!)

回顾

今天您学习了:

  • 变量作用域是什么以及为什么它很重要
  • 局部全局变量之间的区别
  • global关键字如何工作
  • 解析变量名的LEGB规则
  • 为什么使用局部作用域通常更安全

最近发表
标签列表