当前位置: 首页 > news >正文

【自记】Python 局部变量、全局变量及global的示例

        在 Python 中,全局变量能否在函数里直接使用,取决于你是 “读取” 还是 “修改”它 —— 这是理解这个问题的关键!

核心规则:

  1. 仅读取全局变量:函数内可以直接使用,无需 global 声明。
  2. 修改全局变量:必须用 global 声明,否则 Python 会把该变量视为 “局部变量”,导致报错。

先看错误代码

account = 5000000def show():print("ATM,请选择操作:")print("SELECT【1】")print("IN【2】")print("WITHDRAW【3】")print("EXIT【4】")print("PLEASE INPUT:")def select():print(account)def in_5000():account += 5000print(account)def withdraw_5000():account -= 5000print(account)if __name__ == "__main__":while True:show()selection = int(input())if selection == 1:select()elif selection == 2:in_5000()elif selection == 3:withdraw_5000()else:break

        代码中,account 已经定义在模块最顶层(是真正的全局变量),此时的错误和之前分析的略有不同,核心问题出在 in_5000() 和 withdraw_5000() 函数修改全局变量时未加 global 声明,具体如下:

一、当前代码的错误分析

  1. select() 函数(正常运行)

    def select():print(account)  # 仅读取全局变量,无需 global,正确
    

    这个函数只读取全局变量 account,不修改它,所以不需要 global 声明,调用时会正常打印余额。

  2. in_5000() 和 withdraw_5000() 函数(报错)

    def in_5000():account += 5000  # 试图修改全局变量,但未加 globalprint(account)
    

            这两个函数修改了全局变量account += 5000 本质是 account = account + 5000),属于 “修改操作”。
    Python 规定:函数内修改全局变量必须用 global 声明,否则会把 account 视为 “局部变量”,而局部变量在赋值前被引用(account + 5000 中的 account),就会触发 UnboundLocalError: local variable 'account' referenced before assignment

二、报错复现

当你运行代码并选择【2】(存款)或【3】(取款)时,会直接报错:

UnboundLocalError: local variable 'account' referenced before assignment

原因就是修改全局变量时未用 global 声明。

三、修复方案

account = 5000000def show():print("ATM,请选择操作:")print("SELECT【1】")print("IN【2】")print("WITHDRAW【3】")print("EXIT【4】")print("PLEASE INPUT:")def select():print(account)  # 仅读取,无需globaldef in_5000():global account  # 修改全局变量,必须声明account += 5000print(account)def withdraw_5000():global account  # 修改全局变量,必须声明account -= 5000print(account)if __name__ == "__main__":while True:show()selection = int(input())if selection == 1:select()elif selection == 2:in_5000()elif selection == 3:withdraw_5000()else:print("结束")  # 调整到break前,确保执行break

四、关键结论

  • 全局变量仅读取时,函数内可以直接使用,无需 global(如 select() 函数)。
  • 全局变量需要修改时(赋值、+=-= 等),函数内必须用 global 声明(如 in_5000() 和 withdraw_5000() 函数)。
  • 你之前的代码错误在于 “修改全局变量时未加 global”,而非变量定义位置,这是之前分析中未明确区分 “读取” 和 “修改” 导致的细节疏漏,特此纠正。

http://www.dtcms.com/a/352121.html

相关文章:

  • Python实现RANSAC进行点云直线、平面、曲面、圆、球体和圆柱拟合
  • 负载均衡之平滑加权轮询(Smooth Weighted Round Robin)详解与实现
  • 前沿技术趋势与应用:探索数字世界的下一个十年
  • 本地通过阿里云ECS建立SSH隧道连接阿里云RDS MYSQL数据库
  • 【P2P】RELAY服务2:cmake+ c实现及ubuntu运行
  • 淘宝/天猫商品详情API数据解析【附代码】
  • 软件检测报告:XML外部实体(XXE)注入漏洞原因和影响
  • 【Erdas实验教程】031:遥感图像频率域增强(傅立叶变换)
  • BCI良好棉花认证标准及申请条件(2025年最新版)
  • 加密狗与U盘的核心区别,U盘能否替代加密狗?
  • 电力工程大模型驱动AI工程计算:从“算错挨骂”到“一键精准”
  • 开发指南135-CSS中定义参数
  • 技术干货丨基于SimSolid的塑胶模具温度场瞬态分析
  • 【贪心算法】day3
  • win11在安装com0com软件后,在设备管理器中虚拟串口黄色感叹号得解决方法
  • 什么是Webpack的热更新(Hot Module Replacement)?原理是什么?
  • 2 梯度下降算法
  • 面试 总结(1)
  • 博士招生 | 南洋理工大学 PINE Lab 招收全奖博士
  • 一文看懂@Bean注解的原理
  • Markdown 编辑器 语法
  • 18、移动应用系统分析与设计
  • 字帖生成器怎么用?电脑手机双端操作指南
  • halcon的默认图像坐标系是怎么样的?
  • Agent实战教程:LangGraph关于智能体的架构模式与核心概念
  • MySQL表的管理
  • Matplotlib渲染性能提升10倍:底层原理与实战技巧
  • 具身智能常用【数据集】汇总篇
  • 三菱FX5U PLC访问字变量的某一位
  • 信长之野望 新生 威力加强版 送修改器 免安装中文版