首页 论坛 置顶 Python基础 :变量作用域

正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 作者
    帖子
  • #27226

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

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


    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规则预测变量行为
    • 安全地更新全局和封闭变量
    • 构建一个计数器跟踪应用以可视化作用域的实际应用
正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 哎呀,回复话题必需登录。