讲师中心 微信公众号
AI工具推荐 视频效率加速

python中global关键字怎么使用_Python global关键字修改全局变量

冬明姑娘_1365

冬明姑娘_1365

发布时间:2025-09-14 23:00:01

|

1056人浏览过

|

来源于php中文网

原创

global关键字用于在函数内修改全局变量,避免创建局部副本;nonlocal则用于修改嵌套函数中外层函数的变量,二者作用域不同:global指向模块级全局变量,nonlocal指向最近的非全局封闭作用域。过度使用global会降低代码可读性、引发副作用、增加耦合度,并在并发环境下导致竞态条件,应优先通过参数传递或类封装管理状态。

python中global关键字怎么使用_python global关键字修改全局变量

在Python里,

global
关键字的核心作用,其实就是让我们能在函数这个局部作用域内部,去明确地告诉解释器:“嘿,我这里要操作的不是一个新创建的局部变量,而是外面那个已经存在的全局变量。” 简单来说,它赋予了函数修改全局变量的能力,而不是默认地创建一个同名的局部副本。

解决方案

我们都知道,Python有它自己的一套变量作用域规则。当你在一个函数内部给一个变量赋值时,如果这个变量之前没有在函数内部被定义过,Python默认会把它当作一个局部变量来处理。这就意味着,即使外面有一个同名的全局变量,函数内部的赋值操作也不会影响到它。

看一个例子,如果不使用

global
:

global_var = 10

def modify_without_global():
    global_var = 20 # 这创建了一个新的局部变量

print(f"修改前: {global_var}")
modify_without_global()
print(f"修改后 (不使用global): {global_var}") # global_var 依然是 10

结果很明显,

global_var
并没有被改变。这是因为在
modify_without_global
函数内部,
global_var = 20
语句创建了一个新的局部变量
global_var
,它只存在于函数执行期间,与外面的全局变量互不相干。

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

那么,

global
关键字就派上用场了。当你需要在函数内部修改一个全局变量时,你需要在第一次引用这个全局变量(并且是赋值操作)之前,用
global
关键字声明它。

global_var = 10

def modify_with_global():
    global global_var # 明确声明我们要操作的是全局变量
    global_var = 20   # 现在,这会修改外部的全局变量

print(f"修改前: {global_var}")
modify_with_global()
print(f"修改后 (使用global): {global_var}") # global_var 变成了 20

这样一来,

global global_var
这行代码就告诉Python解释器,在当前函数作用域内,
global_var
这个名字不再是局部变量,而是指向了全局作用域中的那个
global_var
。后续对
global_var
的赋值操作,就会直接作用于全局变量本身。

Python中global和nonlocal关键字有什么区别?

谈到

global
,很容易就会联想到
nonlocal
。这两个关键字都允许我们在嵌套作用域中修改外部变量,但它们的目标作用域却截然不同,这是理解它们各自用途的关键。

global
关键字,就像我们刚才看到的,它明确地指向了模块级别的全局作用域。也就是说,无论你的函数嵌套了多少层,只要你用
global
声明了一个变量,你操作的就是整个文件(模块)最外层定义的那个变量。它跳过了所有中间的局部作用域,直达顶层。

nonlocal
则不同,它设计出来是为了处理“非局部但非全局”的变量。想象一下一个函数内部又定义了另一个函数(即闭包)。内层函数可能需要修改外层函数(但不是全局)作用域中的变量。这时候,
nonlocal
就登场了。它不会去寻找全局变量,而是向上查找最近的那个非全局的、闭包所在的外部作用域中的变量。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载

看个例子来区分:

global_x = 10 # 全局变量

def outer_function():
    outer_x = 20 # 外层函数的局部变量 (对inner_function来说是非局部变量)

    def inner_function():
        # 尝试修改变量
        global global_x
        nonlocal outer_x

        global_x = 100 # 修改全局变量
        outer_x = 200  # 修改outer_function的局部变量
        local_x = 300  # inner_function的局部变量

        print(f"  在inner_function内部: global_x={global_x}, outer_x={outer_x}, local_x={local_x}")

    print(f"在outer_function调用inner前: global_x={global_x}, outer_x={outer_x}")
    inner_function()
    print(f"在outer_function调用inner后: global_x={global_x}, outer_x={outer_x}")

print(f"在outer_function调用前: global_x={global_x}")
outer_function()
print(f"在outer_function调用后: global_x={global_x}")

运行这段代码,你会发现:

  • global_x
    在
    inner_function
    中被
    global
    声明后,修改会影响到最外层的全局
    global_x
    。
  • outer_x
    在
    inner_function
    中被
    nonlocal
    声明后,修改会影响到
    outer_function
    作用域中的
    outer_x
    。
  • local_x
    只是
    inner_function
    自己的局部变量。

所以,核心区别在于它们“跳”到的作用域层级:

global
一步到位到全局,
nonlocal
则是向上查找最近的非全局封闭作用域。

Python中过度使用global关键字会带来哪些问题?

虽然

global
关键字提供了修改全局状态的便利,但在实际编程中,我个人觉得应该非常谨慎地使用它。过度依赖
global
往往会引入一些难以察觉且难以维护的问题。

首先,代码的可读性和可维护性会急剧下降。当一个变量是全局的,并且可以在程序的任何地方被任何函数修改时,你很难追踪它的值在什么时候、被谁、以何种方式改变了。这就像是一个公共的留言板,每个人都能写,但出了问题,谁写了什么、为什么写,就很难查证了。这对于调试来说简直是噩梦。

其次,它会导致函数失去纯粹性,产生难以预料的副作用。一个理想的函数,它的行为应该只取决于它的输入参数,并返回一个确定的输出。如果函数内部修改了全局变量,那么它的行为就不再仅仅由输入决定,还受到了全局状态的影响。这使得函数的行为变得不确定,也更难进行单元测试。你可能需要为每个测试用例重置全局状态,这本身就是一件麻烦事。

再者,增加了模块间的耦合度。当多个模块或函数都依赖于同一个全局变量时,它们之间就产生了紧密的耦合。一个模块对全局变量的修改,可能会意外地影响到其他模块的行为。这种“隐式”的依赖关系,使得代码重构变得困难,也降低了代码的复用性。

最后,在并发编程中,全局变量更是潜在的灾难。如果多个线程同时尝试修改同一个全局变量,而没有适当的同步机制(比如锁),就可能导致竞态条件(Race Condition),数据变得不一致或产生意想不到的错误。

所以,我的建议是,除非你确实需要一个在整个程序生命周期内都保持一致、且需要被多个函数共享和修改的状态(比如某些配置信息,但即便如此,也通常有更好的管理方式,如通过类或配置文件),否则尽量避免使用

global
。通常,通过函数参数传递数据,或者将相关数据封装到类(对象)中进行管理,是更健壮、更易于维护的编程实践。

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

4905

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

2070

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4518

2023.08.10

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

4753

2025.07.29

什么是低代码
什么是低代码

低代码是一种软件开发方法,使用预构建的组件可快速构建应用程序,无需大量编程。想了解更多低代码的相关内容,可以阅读本专题下面的文章。

3371

2024.05.21

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

40

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

160

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn