Python中Global和Nonlocal关键字的作用域与使用详解

顾言
顾言
发布时间:2026-10-13 | 3人浏览过
原创

本文详细解析Python中global和nonlocal关键字的区别与应用。global用于在函数内修改全局变量,需显式声明;nonlocal用于在嵌套函数中修改外层函数变量,作用于闭包。通过代码示例说明未声明导致的UnboundLocalError及正确用法,帮助开发者掌握变量作用域规则。

Global与Nonlocal概念辨析

在Python编程中,nonlocal和global关键字的作用常常容易让人混淆。这里简要梳理一下两者的核心区别与使用场景。

概念解析

关于global关键字

简单来说,使用global意味着将变量的作用域限定为全局,即修改该变量时会直接改变其对应内存地址中的值。

global语句是一个声明,它的作用范围覆盖整个当前代码块。这意味着在global语句中列出的标识符会被解释器视为全局变量。需要注意的是,即使自由变量可能指向全局变量,如果不使用global声明,解释器也不会自动将其识别为全局变量。

在global语句中列出的名称,不能用于该global语句之前的文本代码块中。

在global语句中列出的名称,也不能被定义为形式参数,或者出现在for循环的控制目标、class定义、函数定义、import语句以及变量注释中。

尽管当前的Python实现并不严格强制执行上述限制,但程序员不应滥用这种灵活性。因为未来的实现版本可能会强制执行这些限制,或者悄然改变程序的行为逻辑。

程序员需注意:global是向解释器发出的指令,它仅适用于与global语句同时解析的代码。特别是,包含在提供给内置exec()函数的字符串或代码对象中的global语句,不会影响包含该函数调用的外层代码块;同样,包含在字符串中的代码也不会受外层代码中global语句的影响。eval()和compile()函数也存在类似的限制。

Global关键字的作用域规则

一、Global关键字详解

1、global关键字的主要作用是在函数或其他局部作用域中引用全局变量。但如果只是在局部作用域中读取而不修改全局变量,则无需使用global关键字。


gcount = 0
def global_test():
  gcount+=1
  print (gcount)
global_test()

以下代码会引发报错:第一行定义了全局变量gcount,在内部函数中尝试引用并修改它。此时Python解释器会默认gcount为局部变量,但由于内部函数并未对gcount进行定义和赋值,因此会抛出异常。

2、如果需要在局部作用域中修改全局变量,必须在局部代码块中显式声明该全局变量。


gcount = 0
def global_test():
  global gcount
  gcount+=1
  print (gcount)
global_test()

上述代码的输出结果为:1

3、如果在局部作用域中不声明全局变量,且仅读取而不修改全局变量,则可以正常使用该变量。


gcount = 0
def global_test():
  print (gcount)
global_test()

上述代码的输出结果为:0

Nonlocal在闭包中的应用

二、Nonlocal关键字详解

关于nonlocal关键字

nonlocal关键字仅在闭包内部生效,其作用域限定在闭包范围内。它会影响外函数和内函数之间的变量交互,但不会影响闭包外部的变量。

nonlocal语句使列出的标识符引用除global变量外最近的封闭范围中已绑定的变量。这一点非常重要,因为默认的绑定行为是首先搜索本地名称空间。该语句允许封装代码将变量重新绑定到本地作用域之外、全局(模块)作用域之外的封闭范围中。

nonlocal语句中列出的名称与global语句不同,它们必须引用封闭范围中已经存在的绑定(即无法明确确定应在何处创建新绑定的范围)。

1、nonlocal声明的变量既不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。


def make_counter():
  count = 0
  def counter():
    nonlocal count
    count += 1
    return count
  return counter   
def make_counter_test():
 mc = make_counter()
 print(mc())
 print(mc())
 print(mc())
make_counter_test()

上述代码的输出结果为:

1

2

3

多重作用域混合使用示例

三、混合使用示例


def scope_test():
  def do_local():
    spam = "local spam" #此函数定义了另外的一个spam字符串变量,并且生命周期只在此函数内。此处的spam和外层的spam是两个变量,如果写出spam = spam + “local spam” 会报错
  def do_nonlocal():
    nonlocal spam    #使用外层的spam变量
    spam = "nonlocal spam"
  def do_global():
    global spam
    spam = "global spam"
  spam = "test spam"
  do_local()
  print("After local assignmane:", spam)
  do_nonlocal()
  print("After nonlocal assignment:",spam)
  do_global()
  print("After global assignment:",spam)
 
scope_test()
print("In global scope:",spam)

上述代码的输出结果为:

After local assignmane: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam

总结

以上介绍了Python中Global和Nonlocal关键字的详细用法,希望对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持! 如果觉得本文对您有帮助,欢迎转载,请注明出处,谢谢!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表