global关键字用于在函数内修改全局变量,避免创建局部副本;nonlocal则用于修改嵌套函数中外层函数的变量,二者作用域不同:global指向模块级全局变量,nonlocal指向最近的非全局封闭作用域。过度使用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
global_var
global_var
global_var
谈到
global
nonlocal
global
global
nonlocal
nonlocal
看个例子来区分:
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
虽然
global
global
首先,代码的可读性和可维护性会急剧下降。当一个变量是全局的,并且可以在程序的任何地方被任何函数修改时,你很难追踪它的值在什么时候、被谁、以何种方式改变了。这就像是一个公共的留言板,每个人都能写,但出了问题,谁写了什么、为什么写,就很难查证了。这对于调试来说简直是噩梦。
其次,它会导致函数失去纯粹性,产生难以预料的副作用。一个理想的函数,它的行为应该只取决于它的输入参数,并返回一个确定的输出。如果函数内部修改了全局变量,那么它的行为就不再仅仅由输入决定,还受到了全局状态的影响。这使得函数的行为变得不确定,也更难进行单元测试。你可能需要为每个测试用例重置全局状态,这本身就是一件麻烦事。
再者,增加了模块间的耦合度。当多个模块或函数都依赖于同一个全局变量时,它们之间就产生了紧密的耦合。一个模块对全局变量的修改,可能会意外地影响到其他模块的行为。这种“隐式”的依赖关系,使得代码重构变得困难,也降低了代码的复用性。
最后,在并发编程中,全局变量更是潜在的灾难。如果多个线程同时尝试修改同一个全局变量,而没有适当的同步机制(比如锁),就可能导致竞态条件(Race Condition),数据变得不一致或产生意想不到的错误。
所以,我的建议是,除非你确实需要一个在整个程序生命周期内都保持一致、且需要被多个函数共享和修改的状态(比如某些配置信息,但即便如此,也通常有更好的管理方式,如通过类或配置文件),否则尽量避免使用
global
以上就是python中global关键字怎么使用_Python global关键字修改全局变量的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号