Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Python中的全局变量和局部变量有什么区别?_创想鸟

Python中的全局变量和局部变量有什么区别?

全局变量在整个程序中可访问,局部变量仅在函数内有效。Python按LEGB规则查找变量,函数内修改全局变量需用global声明,避免命名冲突和副作用。

python中的全局变量和局部变量有什么区别?

Python中的全局变量和局部变量,核心区别在于它们的作用范围(scope)和生命周期。简单来说,局部变量只在定义它的函数或代码块内部有效,当函数执行完毕,这些局部变量也随之销毁。而全局变量则在整个程序执行期间都可访问,无论你身处哪个函数或代码块。这种区分是语言设计中非常基础但也极其重要的概念,它直接影响着代码的模块化、可维护性和潜在的错误。

解决方案

理解Python中变量作用域的机制,是编写健壮、可预测代码的关键。当我们谈及局部变量,它们通常是在函数内部声明的,例如:

def my_function():    local_var = "我只存在于这个函数内部"    print(local_var)my_function()# print(local_var) # 尝试在这里访问会报错:NameError
local_var

my_function

执行完毕后,就从内存中消失了。这其实挺好的,它避免了不同函数之间不必要的耦合,让每个函数可以专注于自己的任务,而不用担心会不小心修改到其他地方的变量。这就像你在自己的办公室里放了一堆私人物品,其他人没法直接拿走或修改。

而全局变量则不同,它们通常在所有函数之外定义:

立即学习“Python免费学习笔记(深入)”;

global_var = "我可以在程序的任何地方被访问"def another_function():    print(global_var) # 可以直接访问def modify_global_attempt():    global_var = "我试图修改全局变量,但其实创建了一个新的局部变量"    print(f"函数内部的局部变量: {global_var}")print(f"初始全局变量: {global_var}")another_function()modify_global_attempt()print(f"函数调用后的全局变量: {global_var}") # 全局变量的值并未改变!

这里有一个经典的陷阱:在

modify_global_attempt

函数内部,

global_var = "..."

这行代码并没有修改外部的全局变量,而是创建了一个同名的局部变量。Python在查找变量时,会优先在当前局部作用域中寻找。如果找到了,就用局部变量;如果没找到,才会一层层向外找,直到全局作用域。这种行为,有时候会让人觉得有点“反直觉”,但它确实是为了避免函数无意中污染全局状态。

如果真的需要在函数内部修改全局变量,我们就需要明确地告诉Python我们的意图,使用

global

关键字:

true_global_var = "我是一个真正的全局变量"def truly_modify_global():    global true_global_var # 明确声明我们要操作的是全局变量    true_global_var = "现在我真的被修改了!"    print(f"函数内部修改后: {true_global_var}")print(f"修改前: {true_global_var}")truly_modify_global()print(f"修改后: {true_global_var}")

这样,

true_global_var

的值才会在函数内部被成功修改。我个人觉得,虽然

global

关键字提供了这种能力,但在实际开发中,除非是处理一些全局配置或常量,否则尽量避免频繁地在函数内部修改全局变量。因为这会让代码的依赖关系变得复杂,难以追踪变量的变化,增加了调试的难度。

Python变量作用域规则详解:LEGB原则是如何工作的?

理解Python如何解析变量名称,离不开一个核心概念——LEGB原则。这四个字母分别代表:

L (Local):当前函数或方法内部的作用域。这是Python查找变量的第一个地方。E (Enclosing):外部嵌套函数的作用域。如果你有一个函数定义在另一个函数里面(闭包),那么内部函数可以访问外部函数的变量。G (Global):模块(文件)的顶层作用域。所有在函数之外定义的变量都属于这个作用域。B (Built-in):Python内置模块的作用域,例如

print

len

str

等内置函数和类型。

当Python尝试解析一个变量名时,它会按照L -> E -> G -> B的顺序进行查找。它会在找到的第一个作用域中使用该变量。如果所有这些作用域都找不到,就会抛出

NameError

举个例子,我们来嵌套一下:

x = "全局变量" # Gdef outer_function():    x = "外部函数变量" # E    def inner_function():        # 如果这里没有定义x,它会去outer_function找        # 如果outer_function也没有,它会去全局找        # x = "内部函数变量" # L        print(f"在 inner_function 内部: {x}")    inner_function()    print(f"在 outer_function 内部: {x}")print(f"在全局作用域: {x}")outer_function()print(f"在全局作用域 (再次): {x}")

在这个例子中,

inner_function

内部如果引用

x

,它会先检查自己的局部作用域(L),如果没有,就检查

outer_function

的封闭作用域(E),再没有就检查全局作用域(G)。这种层层递进的查找机制,正是Python作用域的精髓。而

nonlocal

关键字,就是为了在E层作用域中修改变量而生的,它允许你在嵌套函数中修改其外层(非全局)函数的变量,而不是创建一个新的局部变量。

何时使用Python全局变量?最佳实践与潜在陷阱分析

全局变量并非一无是处,它们在特定场景下有其存在的价值。最常见的、也是我个人认为相对安全的用法,是用于定义全局常量配置参数。比如,一个应用程序可能需要一个全局的调试模式开关,或者一个数据库连接字符串(尽管后者通常更推荐通过配置管理系统传递)。

DEBUG_MODE = TrueMAX_RETRIES = 5def process_data():    if DEBUG_MODE:        print("DEBUG: 正在处理数据...")    # ... 实际处理逻辑 ...def fetch_from_api():    for attempt in range(MAX_RETRIES):        # ... 尝试API调用 ...        if success:            break

这样的全局变量,由于它们的值通常在程序启动后就不会改变,因此相对安全。它们提供了一种方便的方式,让程序的各个部分都能访问到这些共享的、不变的信息,而不需要通过层层参数传递。

然而,当全局变量涉及可变状态时,情况就复杂了。这是全局变量最常见的陷阱所在。如果多个函数都能够修改同一个全局列表、字典或对象,那么程序的行为会变得非常难以预测。一个函数对全局变量的修改,可能会在不经意间影响到另一个函数的执行,导致“副作用”和难以追踪的bug。

想象一下,你有一个全局的购物车列表,多个函数都在往里面添加或删除商品。如果某个函数在处理过程中清空了列表,而另一个函数正在尝试计算总价,那结果就完全错了。这种情况下,更好的做法是将购物车作为参数传递给函数,或者将其封装在一个类中,通过对象的方法来管理状态。

最佳实践是:

尽量避免使用可变的全局变量:如果非用不可,确保其修改逻辑清晰、受控,并做好文档。优先使用局部变量和函数参数:这能有效隔离代码,减少耦合。全局常量可以接受:但最好用大写字母命名,以示其不可变性。封装状态:对于需要共享的可变状态,考虑将其封装到类中,通过类的实例和方法来管理,而不是暴露为全局变量。

Python函数内部如何修改全局变量?’global’关键字的正确用法

正如前面提到的,要在函数内部修改全局变量,你必须明确地使用

global

关键字。这是Python设计上的一个有意为之的决定,它强制你声明你的意图,防止无意中创建局部变量并遮蔽(shadow)同名的全局变量。

# 假设我们有一个全局计数器call_count = 0def increment_counter():    global call_count # 声明我们要操作的是全局变量call_count    call_count += 1    print(f"函数被调用了 {call_count} 次。")print(f"初始调用次数: {call_count}")increment_counter()increment_counter()increment_counter()print(f"最终调用次数: {call_count}")

在这里,

global call_count

这行代码至关重要。如果没有它,

call_count += 1

会在

increment_counter

函数内部创建一个新的局部

call_count

,并对其进行操作,而外部的全局

call_count

则丝毫未变。

正确使用

global

关键字的场景通常包括:

全局状态更新:比如一个需要被多个部分更新的日志级别、程序运行状态标志等。计数器:如上面的例子,统计某个事件发生的次数。缓存失效:当需要清空或更新一个全局缓存时。

尽管如此,我还是要强调,即使在这些场景下,也要谨慎评估是否有其他更优雅的方案。例如,对于计数器,可以考虑将函数封装到一个类中,让计数器成为类的属性;对于全局状态更新,可以考虑使用单例模式或者将状态作为参数传递。过度依赖

global

关键字,会让代码变得难以理解和维护,因为你无法一眼看出一个函数会影响到哪些外部状态。这就像是你在一个大团队里工作,每个人都可以直接修改公共文件,而不是通过明确的流程提交修改,混乱是必然的。所以,用,但要少用,且要深思熟虑。

以上就是Python中的全局变量和局部变量有什么区别?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369784.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
自定义异常类及其最佳实践
上一篇 2025年12月14日 09:57:52
什么是猴子补丁(Monkey Patch)?有什么利弊?
下一篇 2025年12月14日 09:58:05

相关推荐

  • Ubuntu安装Python3.6并切换到3.6版本「建议收藏」

    大家好,很高兴再次与你们见面,我是你们的好朋友全栈君。 文章目录 前言==补充==1 了解系统中已安装的Python版本2 安装Python 3.63 从Python 2.7切换到Python 3.64 中间遇到的问题4.1 问题一4.2 问题二总结参考文献 前言本文记录我在Ubuntu 16.04…

    2026年9月21日
    000
  • 陈震透露劳斯莱斯事故原因:辅助驾驶是“元凶”

    知名汽车博主陈震,就其于10月3日驾驶劳斯莱斯闪灵发生交通事故一事,作出了最新的回应。在北京交警通报其负事故全部责任后,陈震于昨晚发文,透露了事故发生的核心原因,他坦言,是由于自己使用了车辆的辅助驾驶功能,并将其归咎于自己“对闪灵的辅助驾驶能力边界认知不够清晰”。 辅助驾驶“甩锅”,驾驶员永远是第一…

    2026年9月21日
    000
  • VSCode语言特性贡献点配置

    通过配置package.json中的contributes字段可实现VSCode语言扩展,依次需设置语法高亮(grammars)、语言绑定(languages)、激活事件(activationEvents)及语言服务器功能(如补全、跳转),并定义language-configuration.json…

    2026年9月21日
    000
  • 长佩阅读如何自定义封面

    在长佩阅读中,设置自定义封面可以让你的书架更具个人风格。以下是具体操作步骤: 一、确认书籍是否支持自定义封面 并非所有书籍都开放自定义封面功能,你需要先进入书籍详情页查看是否存在“自定义封面”这一选项。若该按钮存在,则说明这本书允许用户更换封面。 二、准备合适的封面图片 选择一张你喜欢的图片作为新封…

    2026年9月21日
    000
  • MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    mysql热点数据缓存的核心在于将频繁访问的数据保留在内存中以减少磁盘i/o,提升查询速度并缓解数据库压力。1. innodb缓冲池是关键机制,需合理配置其大小(通常为服务器内存的70-80%)及实例数以优化性能;2. 应用层缓存如redis/memcached通过前置缓存逻辑减少对mysql的直接…

    2026年9月21日 用户投稿
    000
  • VSCode怎么更改解码方式_VSCode文件编码修改教程

    VSCode通过设置文件编码解决乱码问题,可手动选择“以不同编码重新打开”或“使用编码保存”,推荐统一使用UTF-8编码并启用files.autoGuessEncoding自动检测,避免编码错误。 VSCode更改解码方式主要通过设置文件编码来实现,以便正确显示文件内容。通常情况下,VSCode会自…

    2026年9月21日
    800
  • 如何用Animoto制作AI营销视频?快速生成商业AI视频的教程

    如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程

    Animoto通过模板与拖放功能,结合AI生成的文案和配音,帮助用户快速制作品牌统一、节奏合理、带明确CTA的高效营销视频,适用于多平台推广。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Animoto是一个非常适合快速制作AI营销视频的…

    2026年9月21日 用户投稿
    000
  • 使用本地HTML文件运行JavaScript脚本失败的原因及解决方案

    本文旨在帮助开发者理解在没有Web服务器的情况下,直接通过浏览器打开本地HTML文件时,JavaScript脚本可能无法正常运行的原因,并提供相应的解决方案。文章将深入探讨浏览器安全策略、相对路径问题以及如何正确引入和执行JavaScript脚本,确保你的HTML、CSS和JavaScript代码能…

    2026年9月21日
    000
  • VSCode怎么看效果_VSCode实时预览和调试代码运行效果教程

    VSCode通过实时预览扩展和内置调试器实现代码效果查看。使用Live Server可实时预览前端页面,保存即刷新;Markdown文件支持侧边预览。调试功能需配置launch.json,支持Node.js、Python、浏览器端JavaScript等,通过断点、变量监视、调用堆栈等深入分析代码执行…

    2026年9月21日
    000
  • 蝴蝶号无人直播中的AI角色控制技巧与注意事项

    蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项

    要让蝴蝶号ai角色在直播中更具真实感和互动性,关键在于注入“人味儿”,打破“机器感”。首先,声音要有温度,选择有情感起伏的音色,并根据不同语境调整语调、语速,适当加入语气词增强亲切感;其次,确保视觉形象与行为模式统一,动作、表情、眼神与语音内容自然同步,强化人设一致性;第三,建立多层次互动逻辑,ai…

    2026年9月21日 用户投稿
    400
  • MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南

    MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南

    mysql原生全文搜索功能存在明显局限,需结合外部搜索引擎才能满足复杂需求。1. mysql全文搜索适用于小数据量、简单查询场景,但分词能力弱,尤其对中文支持差,查询功能有限,无法实现模糊查询、纠错等高级功能,且性能随数据量增长显著下降。2. 外部搜索引擎如elasticsearch(es)和sph…

    2026年9月21日 用户投稿
    000
  • MacBookPro怎么下VSCode_MacBookPro下载安装VSCode详细教程

    访问code.visualstudio.com下载Mac通用版安装包;2. 解压后将Visual Studio Code.app拖入“应用程序”文件夹;3. 首次运行需右键选择“打开”以绕过安全限制;4. 推荐安装Python、Prettier等常用插件并配置环境变量;5. 若字体模糊可调整zoom…

    2026年9月21日
    000
  • HuggingFace的AI混合工具如何使用?开发AI模型的实用操作教程

    HuggingFace的AI混合工具核心在于其生态系统设计,通过Transformers库的统一接口、Pipelines的抽象封装、Datasets与Accelerate等工具,实现多模型组合与微调。它允许开发者将复杂任务拆解,利用预训练模型如BERT、T5等,通过Python逻辑串联不同Pipel…

    2026年9月21日
    1000
  • PHPComposer怎么安装_PHPComposer依赖管理工具安装与使用指南

    PHPComposer是PHP的依赖管理工具,类似npm或pip。需先安装PHP,再下载并验证composer-setup.php,执行安装生成composer.phar,推荐全局安装至/usr/local/bin/composer,运行composer –version验证。使用com…

    2026年9月21日
    000
  • 一周学会蝴蝶号无人直播的完整课程计划推荐

    一周学会蝴蝶号无人直播的完整课程计划推荐一周学会蝴蝶号无人直播的完整课程计划推荐一周学会蝴蝶号无人直播的完整课程计划推荐一周学会蝴蝶号无人直播的完整课程计划推荐

    掌握“蝴蝶号”无人直播的核心要义,一周内可搭建初步系统并具备独立操作能力。1.第一天厘清概念并完成基础环境搭建;2.第二天熟悉obs基础操作与场景构建;3.第三天准备高质量内容素材并确定风格;4.第四天设置自动化逻辑与推流配置;5.第五天处理互动机制及常见问题;6.第六天进行首次正式直播并复盘;7.…

    2026年9月21日 用户投稿
    100
  • VSCode报错怎么显示中文_VSCode错误信息本地化与中文显示教程

    安装中文语言包可将VSCode界面和错误提示转为中文,提升使用便捷性;但外部工具如编译器、解释器生成的报错仍为英文,因VSCode仅显示其原始输出,无法翻译。 在VSCode中让报错信息显示中文,核心在于安装并启用官方的中文(简体)语言包。这不仅仅是针对错误信息,而是将整个VSCode的用户界面本地…

    2026年9月21日
    000
  • 如何使用Ribbet的AI功能裁剪图片?快速实现精准图像裁剪

    答案:Ribbet的AI裁剪功能可快速智能识别主体并推荐裁剪方案,支持手动微调与多种比例选择,结合亮度、色彩等编辑工具优化效果,适用于制作符合社交媒体尺寸要求的封面图,操作简便且大部分功能免费,适合追求效率的普通用户。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月21日
    400
  • VSCode怎么设置变量窗口_VSCode调试时变量监视面板使用教程

    答案:配置launch.json并设置断点后,通过VSCode调试界面的变量和监视面板可实时查看变量值。具体包括正确设置program路径,利用变量面板查看作用域内变量,使用监视面板添加表达式或变量进行持续跟踪,结合调试按钮控制执行流程,并可通过条件断点、控制台输出、debugger语句、Sourc…

    2026年9月21日
    100
  • 怎么全选VSCode多个光标_VSCode多光标操作与批量选择文本教程

    VSCode中高效创建多光标的方法包括:Alt+Click手动添加光标,适用于不规则位置;Ctrl+Alt+方向键垂直添加光标,适合连续多行操作;Ctrl+D逐个选择匹配项,精准控制选择范围;Ctrl+Shift+L一次性选择所有匹配项,实现全局批量修改。结合查找替换和列选择模式可进一步提升编辑效率…

    2026年9月21日
    100
  • MySQL自动化性能测试方案_MySQL持续监控调优数据库效率

    MySQL自动化性能测试方案_MySQL持续监控调优数据库效率MySQL自动化性能测试方案_MySQL持续监控调优数据库效率MySQL自动化性能测试方案_MySQL持续监控调优数据库效率MySQL自动化性能测试方案_MySQL持续监控调优数据库效率

    mysql自动化性能测试和持续监控的核心在于构建闭环反馈系统,包含模拟真实负载、全面数据采集、自动化执行与分析、数据驱动的持续调优四大环节。①测试环境需与生产一致并隔离,使用docker、虚拟机或云沙盒,解决数据同步与脱敏问题;②负载生成工具如sysbench、jmeter、locust或自定义脚本…

    2026年9月21日 用户投稿
    200

发表回复

登录后才能评论
关注微信