“nonlocal” 是什么意思? 在 Python 3 中做什么?
nonlocal
在 Python 3.x 中做什么?
要关闭OP需要nonlocal
并且没有意识到的调试问题,请使用是否可以修改python 中的变量位于外部范围,但不是全局范围? 相反。
尽管 Python 2 是 自 2020 年 1 月 1 日起正式不再支持,如果由于某种原因您被迫维护 Python 2.x 代码库并且需要与 nonlocal 等效的代码库code>,请参阅Python 2.x 中的非本地关键字。
What does nonlocal
do in Python 3.x?
To close debugging questions where OP needs nonlocal
and doesn't realize it, please use Is it possible to modify variable in python that is in outer, but not global, scope? instead.
Although Python 2 is officially unsupported as of January 1, 2020, if for some reason you are forced to maintain a Python 2.x codebase and need an equivalent to nonlocal
, see nonlocal keyword in Python 2.x.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
比较一下,不使用
nonlocal
:对此,使用
nonlocal
,其中inner()
的x
现在也是outer()
的x
:如果我们要使用
global
,它将把 x 绑定到正确的“全局”值:Compare this, without using
nonlocal
:To this, using
nonlocal
, whereinner()
'sx
is now alsoouter()
'sx
:If we were to use
global
, it would bindx
to the properly "global" value:简而言之,它允许您为外部(但非全局)范围内的变量赋值。 请参阅 PEP 3104 了解所有详细信息。
In short, it lets you assign values to a variable in an outer (but non-global) scope. See PEP 3104 for all the gory details.
谷歌搜索“python nonlocal”出现了该提案,PEP 3104,它完整地描述了该语句背后的语法和推理。 简而言之,它的工作方式与
global
语句完全相同,只是它用于引用既不是函数全局也不是局部的变量。下面是一个简短的示例,说明您可以用它做什么。 计数器生成器可以重写以使用它,以便它看起来更像带有闭包的语言的习惯用法。
显然,您可以将其编写为生成器,例如:
但是虽然这是完全惯用的Python,但似乎第一个版本对于初学者来说会更明显一些。 通过调用返回的函数来正确使用生成器是一个常见的混淆点。 第一个版本显式返回一个函数。
A google search for "python nonlocal" turned up the Proposal, PEP 3104, which fully describes the syntax and reasoning behind the statement. in short, it works in exactly the same way as the
global
statement, except that it is used to refer to variables that are neither global nor local to the function.Here's a brief example of what you can do with this. The counter generator can be rewritten to use this so that it looks more like the idioms of languages with closures.
Obviously, you could write this as a generator, like:
But while this is perfectly idiomatic python, it seems that the first version would be a bit more obvious for beginners. Properly using generators, by calling the returned function, is a common point of confusion. The first version explicitly returns a function.
它采用与源代码中的参考点“最接近”的一个。
这称为“词汇范围”,并且已成为标准 40 年以上。
Python 的类成员实际上位于名为
__dict__
的字典中,并且永远不会通过词法作用域来访问。如果您不指定
nonlocal
但指定x = 7
,它将创建一个新的局部变量“x”。如果您指定
nonlocal
,它将找到“最接近的”“x”并分配给它。如果您指定
nonlocal
并且没有“x”,它将给您一条错误消息。关键字
global
对我来说一直很奇怪,因为它很乐意忽略除最外面的“x”之外的所有其他“x”。It takes the one "closest" to the point of reference in the source code.
This is called "Lexical Scoping" and is standard for >40 years now.
Python's class members are really in a dictionary called
__dict__
and will never be reached by lexical scoping.If you don't specify
nonlocal
but dox = 7
, it will create a new local variable "x".If you do specify
nonlocal
, it will find the "closest" "x" and assign to that.If you specify
nonlocal
and there is no "x", it will give you an error message.The keyword
global
has always seemed strange to me since it will happily ignore all the other "x" except for the outermost one.来源:Python 语言参考
Source: Python Language Reference
引自 Python 3 参考:
正如参考文献中所述,在多个嵌套函数的情况下,仅修改最近的封闭函数中的变量:
“最近的”变量可以位于几层之外:
但它不能是全局变量:
Quote from the Python 3 Reference:
As said in the reference, in case of several nested functions only variable in the nearest enclosing function is modified:
The "nearest" variable can be several levels away:
But it cannot be a global variable:
我个人对“非局部”声明的理解(请原谅,因为我对 Python 和编程很陌生)是“非局部”是一种在迭代函数中使用全局功能而不是代码本身的方法。 如果愿意的话,可以在函数之间使用全局语句。
My personal understanding of the "nonlocal" statement (and do excuse me as I am new to Python and Programming in general) is that the "nonlocal" is a way to use the Global functionality within iterated functions rather than the body of the code itself. A Global statement between functions if you will.
文档如下所示:
例如,
inner()
中的nonlocal foo
可以访问非局部变量foo = 10
在middle()
中,但不是在outer()
中的非局部变量foo = 5
或 >outer()
外部的全局变量foo = 0
如下所示:The documentation says below:
So for example,
nonlocal foo
ininner()
can access the non-local variablefoo = 10
inmiddle()
but not the non-local variablefoo = 5
inouter()
or the global variablefoo = 0
outsideouter()
as shown below:使用“非局部”内部函数(即嵌套内部函数)可以读取和读取 外部父函数的特定变量的“写入”权限。。 非局部只能在内部函数内部使用
例如:
with 'nonlocal' inner functions(ie;nested inner functions) can get read & 'write' permission for that specific variable of the outer parent function. And nonlocal can be used only inside inner functions
eg:
如果普通脚本中有普通函数,则可能有两组变量:
如果您在另一个函数(内部函数)内部定义了一个函数,则可能有三组变量:
如果您有内部嵌套函数,并且您需要访问外部函数中定义的变量,那么非局部变量就有意义。
If you have a normal function in a normal script, you have potentially two sets of variables:
If you have a function defined inside another function (an inner function), you have potentially three sets of variables:
Nonlocal variables are meaningful if you have inner, nested functions, where you need to access variables defined in the outer function.