Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python: 关键字nonlocal和global的区别

Python: 关键字nonlocal和global的区别

作者头像
Exploring
发布于 2022-09-20 06:07:35
发布于 2022-09-20 06:07:35
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

文章背景: Python中的变量,存在相应的作用域。根据作用域的不同,主要有局部变量全局变量非局部变量。关键字global用于定义全局变量,而关键字nonlocal用于定义非局部变量。

本文在查阅相关资料的基础上,对局部变量、全局变量和非局部变量进行了介绍,还对关键字globalnonlocal的使用场景进行了梳理。

1 局部变量

2 全局变量

3 非全局变量

1 局部变量

在函数体内或局部范围内声明的变量称为局部变量

(1) 通常,我们在函数内部声明一个变量以创建局部变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def foo():
    y = "local"
    print(y)

foo()

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local

(2) 在函数外访问局部变量,程序将报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def foo():
    y = "local"

foo()
print(y)

运行结果:程序报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NameError: name 'y' is not defined

局部变量只在函数foo()或局部范围内工作。

2 全局变量

在函数外部或全局范围内声明的变量称为全局变量。这意味着可以在函数内部或外部访问全局变量。

Python中global关键字的基本规则是:

  • 当我们在函数内部创建变量时,默认情况下它是局部的。
  • 当我们在函数外部定义变量时,默认情况下它是全局的。您不必使用global关键字。
  • 我们使用global关键字在函数内部读写全局变量。
  • 在函数外使用global关键字无效。 (1) 从函数内部访问全局变量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
c = 1   # 全局变量

def add():
    print(c)

add()

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1

(2) 从函数内部修改全局变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
c = 1  # 全局变量

def add():
    c = c + 2  # increment c by 2
    print(c)

add()

运行结果:程序报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UnboundLocalError: local variable 'c' referenced before assignment

因为我们只能访问全局变量,而不能从函数内部对其进行修改。若要在函数内部修改,需要使用global关键字。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
c = 1  # 全局变量

def add():
    global c
    c = c + 2  # increment c by 2
    print(c)

add()
print("c =", c)

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3
c = 3

(3) 在嵌套函数中的全局变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = 5

def foo():
    x = 20

    def bar():
        global x
        x = 25

    print("在调用bar之前: ", x)
    print("调用bar")
    bar()
    print("在调用bar之后: ", x)

foo()
print("x在主体内: ", x)

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
在调用bar之前:  20
调用bar
在调用bar之后:  20
x在主体内:  25

存在同名变量时,python引用变量的顺序为:当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量。

在调用函数bar()的前后,由于函数foo()中,局部变量x的存在,变量x接受局部变量的值,即x =20。此外,在函数bar()中,我们使用了global关键字创建了全局变量,因此,函数内部对x的修改,也会体现到函数foo()以外。所以,在调用函数foo()之后,x=25。

如果将函数foo()内的代码行x = 20去掉。修改后的代码块如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = 5

def foo():

    def bar():
        global x
        x = 25

    print("在调用bar之前: ", x)
    print("调用bar")
    bar()
    print("在调用bar之后: ", x)

foo()
print("x在主体内: ", x)

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
在调用bar之前:  5
调用bar
在调用bar之后:  25
x在主体内:  25

在函数bar()中,我们使用了global关键字创建了全局变量。函数bar()内部对x的修改,也会体现到函数foo()内部。

3 非全局变量

(1) 非全局变量,通过关键字nonlocal来定义。只在闭包里面生效,作用域就是闭包里面的,外函数和内函数都影响,但是闭包外面不影响。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = 0

def outer():
    x = 1
    def inner():
        nonlocal x
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)

outer()
print("global:", x)

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
inner: 2
outer: 2
global: 0

在函数inner()内,我们使用了nonlocal关键字创建了非局部变量。函数inner()内部对x的修改,体现到了函数内部和函数outer()的内部,但函数outer()的外部不受影响。

(2) nonlocal的作用范围仅对于所在子函数的上一层函数中拥有的局部变量,必须在上层函数中已经定义过,并且不是非全局变量,否则报错。Nonlocal variable must be bound in an outer function scope.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def make_counter():
    count = 0

    def counter():
        nonlocal count
        count += 1
        return count
    return counter


test = make_counter()
print(test())
print(test())

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1
2

在函数counter()内,我们使用了nonlocal关键字创建了非局部变量。

针对代码行test = make_counter(),这里将函数名counter赋给了变量test。因此,代码test(),本质上运行的是counter()。第一次运行test(),返回的count值是1。第二次运行test(),返回count值是2。

参考资料:

[1] Python 全局,局部和非局部变量(https://www.cainiaojc.com/python/python-global-local-nonlocal-variables.html

[2] Python Global 关键字(https://www.cainiaojc.com/python/python-global-keyword.html

[3] python关键字nonlocal和global的区别(https://www.jianshu.com/p/ab69b83a8d8a

[4] python nonlocal 和 global 的区别(https://www.cnblogs.com/kongzhongqijing/articles/14666653.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据处理与编程实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 新手突破瓶颈指南:关键字 nonlocal 与 global 理解和应用
在 Python 编程中,变量的作用域决定了变量的可访问性和生命周期。nonlocal 和 global 关键字是用于管理变量作用域的两个重要工具。理解它们的用法对编写高效、清晰的代码至关重要。
MegaQi
2024/08/14
3660
Python 新手突破瓶颈指南:关键字 nonlocal 与 global 理解和应用
Day4作用域,Python关键字global和nonlocal使用
@[TOC](【重学Python】Day4作用域,python关键词global和nonlocal使用)
李鹏华
2024/04/25
1470
【重学Python】Day4作用域,Python关键字global和nonlocal使用
作用域是指变量的有效范围。变量并不是在每一个位置都可以访问,访问权限取决于这个变量在哪里赋值,作用域哪个作用域内。在python中的作用域一共分为4种。分别是:
李鹏华
2024/04/25
7030
#抬抬小手学Python# Python 之作用域下的 global 和 nonlocal 关键字
该部分内容涉及 Python 变量作用域相关知识,变量作用域指的是变量的有效作用范围,直接理解就是 Python 中的变量不是任意位置都可以访问的,有限制条件。
查理不是猹
2021/12/28
5140
python基础之函数global和nonlocal关键字
  实际开发过程中,经常会遇到很多完全相同或者非常相似的操作,这时,可以将实现类似操作的代码封装为函数,然后在需要的地方调用该函数。这样不仅可以实现代码的复用,还可以使代码更有条理性,增加代码的可靠性。下面我们来介绍一下python的函数global和nonlocal关键字相关内容。
jiankang666
2022/12/05
2720
python基础之函数global和nonlocal关键字
Python3 关键字nonlocal
在Python 2.x中,闭包只能读外部函数的变量,而不能改写它。为了解决这个问题,Python 3.x引入了nonlocal关键字,在闭包内用nonlocal声明变量,就可以让解释器在外层函数中查找变量名。
py3study
2020/01/02
8660
python 函数嵌套和nonlocal关键字
与global关键字有点相似,可以对比着理解。nonlocal关键字只能作用域局部变量,且始终找离当前最近的上层局部作用域中的变量。看栗子:
全栈程序员站长
2022/10/04
4740
【python篇】关于函数当中的那些事,轻松拿捏
函数的定义:使用 def 关键字定义一个函数,以及函数的基本结构,包括函数名、参数列表、函数体和返回值。
用户11286421
2024/09/23
1610
python2 nonlocal_python关键字及用法
python变量引用顺序:从当前作用域开始寻找变量,如果没找到就往上一层作用域寻找,没找到就再上一层……
全栈程序员站长
2022/10/04
3080
python2 nonlocal_python关键字及用法
python2 nonlocal_Python nonlocal
在Python程序中声明、改变、查找变量名时,都是在一个保存变量名的命名空间中进行中,此命名空间亦称为变量的作用域。python的作用域是静态的,在代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定. 变量作用域之LENGB
全栈程序员站长
2022/10/04
3560
Python中nonlocal的使用
在 Python 编程中,我们经常会遇到需要在嵌套函数中访问和修改外部作用域变量的情况。这时,nonlocal 关键字就发挥了它的作用。本文将详细探讨 nonlocal 的使用场景、工作原理以及一些实际应用示例,帮助读者更好地理解和运用这一特性。
kwan的解忧杂货铺
2024/08/04
6140
python nonlocal关键字「建议收藏」
non – local 非局部变量 如果两个嵌套函数,一个函数A里面又包含了一个函数B,那么对于B中的名称来说A中的作用域就为nonlocal 作用域:enclosing作用域 —外层非全局作用域 如果要在内层函数中修改外层变量,则需要用到 nonlocal 关键字
全栈程序员站长
2022/10/03
3550
python nonlocal关键字「建议收藏」
python开发_python关键字
The following identifiers are used as reserved words, or keywords of the language, and cannot be used as ordinary identifiers. They must be spelled exactly as written here:
Hongten
2018/09/13
9920
连仕彤博客[Python笔记] Python3增加的关键字nonlocal
前言 Python里只有2种作用域:全局作用域和局部作用域。全局作用域是指当前代码所在模块的作用域,局部作用域是指当前函数或方法所在的作用域。其实准确来说,Python 3.x引入了nonlocal关键字,可以用于标识外部作用域的变量。 局部作用域里的代码可以读外部作用域(包括全局作用域)里的变量,但不能更改它。一旦进行更改,就会将其当成是局部变量。而如果在更改前又进行了读取操作,则会抛出异常。 验证步骤 Python中(2.X和3.X版本)如果在一个函数的局部作用域中修改外部作用域的变量,就会报Unb
行 者
2018/06/13
5310
Python学习:关键字global和nonlocal的用法说明
nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。
全栈程序员站长
2022/10/04
3200
Python学习:关键字global和nonlocal的用法说明
【Python 知识宝库】带你快速认识 Global 关键字
在 Python 编程中,global 关键字是一个非常重要的概念,它在处理函数内部和外部变量的作用域问题时发挥着关键作用。对于初学者来说,理解 global 关键字可能会有些困难,但一旦掌握,它将为你打开新的编程思路和解决问题的方法。本文将深入探讨 global 关键字的定义、使用场景、注意事项及最佳实践,带你快速了解其在 Python 中的重要性。
鸽芷咕
2025/05/31
910
Python随笔(一)Python3关键字 原
(adsbygoogle = window.adsbygoogle || []).push({});
Pulsar-V
2019/04/01
6860
Python随笔(一)Python3关键字
                                                                            原
深入理解Python变量作用域与函数闭包
1、引言 最近遇到一个求最长回文子串的题目,于是,我写了如下的代码: class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str """ if len(s) < 2: return s maxlen = 0 res = ''
石晓文
2018/04/11
1.8K0
python global关键字_python中global是什么意思
首先需要说的是,我是初学Python,这篇文章只是用于展示global和nonlocal关键字的区别,是很简单的知识点,如果你已经学过,可以绕道。因为不经常写博客,而且是个Python小白,所以内容有些啰嗦。。。
全栈程序员站长
2022/10/04
1.4K0
python global关键字_python中global是什么意思
深入探讨Python中的命名空间与作用域
在Python中,命名空间(Namespace)和作用域(Scope)是两个重要的概念,它们决定了变量的可见性和访问规则。本文将深入探讨Python中命名空间和作用域的概念,并通过代码实例进行解释。
一键难忘
2024/07/05
3850
推荐阅读
相关推荐
Python 新手突破瓶颈指南:关键字 nonlocal 与 global 理解和应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验