Python基础 :变量作用域

 变量作用域(局部、全局和非局部)

项目:构建一个“计数器跟踪器”应用程序,以探索变量作用域的行为。


01. 学习目标

通过本课的学习,你将能够:

  • 理解局部全局非局部变量的工作原理
  • 识别函数内外的变量可见性
  • 正确使用globalnonlocal关键字
  • 应用LEGB规则来预测变量访问顺序

02. 问题场景

你正在创建一个小程序,用于计算一个函数被调用的次数。

在此过程中,你注意到一些变量消失或未按预期更新。

让我们探索作用域——控制变量可以被访问的概念。


03. 第一步 – 局部变量

函数内部声明的变量仅在该函数执行期间存在。

def show_number():
    x = 10   # 局部变量
    print("Inside function:", x)

show_number()
# print(x)   # 错误!(x 在外部未定义)

当函数结束时,局部变量会被销毁


04. 第2步 – 全局变量

任何函数外部声明的变量可以在程序的任何地方使用。

y = 20   # 全局变量

def print_global():
    print("在函数内部:", y)

print_global()
print("在函数外部:", y)

全局变量在整个程序中持续存在。


05. 第三步 – 修改全局变量

如果你想在函数内部改变一个全局变量,请使用global关键字。

count = 0

def increase():
    global count
    count += 1

increase()
increase()
print(count)   # 2

⚠️ 避免过度使用 global。这会使你的代码 难以调试


06. 第4步 – 局部与全局命名冲突

如果局部变量和全局变量共享相同的名称,
局部变量在 函数内部 优先级更高。

x = 100

def test():
    x = 50   # 局部变量(遮蔽了全局变量)
    print("在函数内部:", x)

test()
print("在函数外部:", x)
# 内部函数: 50 # 外部函数: 100

07. 第5步 – LEGB规则

当Python查找一个变量时,它遵循以下顺序:

级别 描述
L (局部) 在当前函数内部
E (封闭) 在外部(封闭)函数内部
G (全局) 在任何函数外部定义
B (内置) Python的内置名称

x = “global”

def outer():
x = “enclosed”
def inner():
x = “local”
print(x) # local
inner()
print(x) # enclosed

outer()
print(x) # global


08. 第6步 – nonlocal 关键字

nonlocal 允许修改封闭(外部)函数中的变量,
不允许修改全局变量。

def outer():
    x = "enclosed"
    def inner():
        nonlocal x
        x = "changed"
        print("inner:", x)
inner() print("outer:", x)

outer()


09. 第七步 – 实践示例

示例 1: 局部变量与全局变量

a = 5

def func():
    a = 10
print("在函数内部:", a)

func()
print(在函数外部:, a)

示例 2: 使用全局变量

counter = 0
def add():
global counter
counter += 1

add()
add()
print(counter) # 2

示例 3:使用 nonlocal

def outer():
msg = "Hello"
def inner():
nonlocal msg
msg = "Hi"
inner()
print(msg)

outer()


10. 第8步 – 迷你项目:计数器追踪应用

构建一个函数,用于计算它被调用的次数,
使用 globalnonlocal 概念。

count = 0

def counter_app():
    global count
    count += 1
    print(f"函数被调用 {count} 次。")

for _ in range(3):
    counter_app()

附加内容 – 使用非局部变量(函数版本)

def make_counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        print(f"计数器: {count}")
    return increment

counter = make_counter()
counter()
counter()
counter()

11. 反思

您已经学习了如何:

  • 区分局部全局非局部变量
  • 根据LEGB规则预测变量行为
  • 安全地更新全局和封闭变量
  • 构建一个计数器跟踪应用以可视化作用域的实际应用

更多