0

0

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

穿越時空

穿越時空

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

|

1016人浏览过

|

来源于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
就登场了。它不会去寻找全局变量,而是向上查找最近的那个非全局的、闭包所在的外部作用域中的变量。

Simplified
Simplified

AI写作、平面设计、编辑视频和发布内容。专为团队打造。

下载

看个例子来区分:

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

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

765

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

640

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

639

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1305

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

709

2023.08.11

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

15

2026.01.20

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 6.7万人学习

Django 教程
Django 教程

共28课时 | 3.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号