nonlocal在python中的用法(2)
nonlocal在python中的用法
def outer_function():
nonlocal x
x = 10
outer_function()
报错信息:
SyntaxError: no binding for nonlocal 'x' found
适用于多层嵌套场景
nonlocal 在多层嵌套的函数场景下显得尤为重要。在这种情况下,如果内层函数需要修改外层函数(但不是全局作用域)中定义的变量, nonlocal 就能派上用场。
nonlocal 促成了一种在函数间共享变量的机制,这大大增强了函数内部的互动性和灵活性。
通过这种方式,嵌套函数不再是孤立的个体,而是能够相互影响和协作,共同完成更复杂的任务。
def outer_function():
shared_variable = 0
def inner_function1():
nonlocal shared_variable
shared_variable += 1
print("Inner Function 1: shared_variable =", shared_variable)
def inner_function2():
nonlocal shared_variable
shared_variable += 2
print("Inner Function 2: shared_variable =", shared_variable)
inner_function1()
inner_function2()
print("Outer Function: shared_variable =", shared_variable)
outer_function()
输出:
Inner Function 1: shared_variable = 1
Inner Function 2: shared_variable = 3
Outer Function: shared_variable = 3
nonlocal如何工作
来看一个简单的例子:
pythonCopy codedef outer():
x = "local"
def inner():
nonlocal x # 这里我们使用 nonlocal 关键字
x = " nonlocal "
print("内部:", x)
inner()
print("外部:", x)
outer()
在这个例子中,inner 函数中的 nonlocal 声明允许我们修改 outer 函数中的 x 变量。
当我们调用 outer 函数时,它首先设置 x 为 “local” ,然后调用 inner函数。
inner 函数中的nonlocal x声明意味着当我们在 inner 中改变x的值时,实际上是在改变outer函数作用域中的x。
因此,输出会是:
内部: nonlocal
外部: nonlocal
与隔壁的global聊聊

nonlocal与global的区别
简单来说, global用于在局部作用域中修改全局变量,而 nonlocal 则用于修改嵌套作用域中的变量。
如果Python是一个国度,那么 global 就像是国王的法令,可以在任何地方发挥作用;
而 nonlocal 更像是一个地方领主的权力,它只在自己的领地内有效。
global 的魔法
global 关键字用来在函数或其他局部作用域中声明全局变量。
x = "这是全局的"
def my_function():
global x # 使用 global 关键字声明
x = "全局变量被修改了"
my_function()
print(x) # 输出: "全局变量被修改了"
相关阅读
-
域名备案流程及步骤 个人域名备案流程详细
一篇很详细的教程是关于域名备案流程及步骤和个人域名备案流程详细方面的讲解,一起来了解了解吧。 上一篇文章中我们讲了怎么注册域名,现在我们来讲解域名怎么备案。在中国,域名的
-
网站首页图片怎么做的 网页设计图片的模板
跟大家说一说网站首页图片怎么做的和网页设计图片的模板的IT小经验,接下来一起来看看吧。 PS制作华丽大气的游戏网站主页图片 制作主页是一项非常复杂的工作,跟创意合成有点类似。首
-
Spring事务详解 深入解析Spring的事务机制
关于Spring事务详解方面的内容,一起来看看吧! Spring 的事务一直是面试官经常询问的一个话题,但很多人只知道@ Transactional这个注解,但对Spring的事务体系,实现方式等方面却知之甚少,本文
-
zk在kafka中的作用
小编带来的是zk在kafka中的作用方面的内容,一定能解决您的问题的,一起来了解吧! /brokers/ids :临时节点,保存所有broker节点信息,存储broker的物理地址、版本信息、启动时间 等,节点名称


