'nonlocal' 变量是否总是从外部循环继承,即使在递归调用中也是如此?
Does 'nonlocal' variable always inherit from the outer loop, even in recursive calls?
我写了一些代码,最近在编写函数的函数时遇到了 'nonlocal' 的需要(在处理递归时遇到了这个问题)。
例如:
def swapPairs(head):
head = None
def helper(node):
nonlocal head
...
head= nex.next
return helper(node.next)
我的问题很简单,因为我们调用递归函数 helper(node.next)
,然后循环回到 nonlocal head
- head
是否取 None 的值(由于非本地负责人)?或者它是否保留在之前的递归调用中分配给它的 head = nex.next
?
所以我试图了解 'nonlocal head'
是否会导致 head
始终采用外部函数中分配给它的任何值,或者情况并非如此?相反,它只是在内部函数中初始化 head 的一种方法,因此它只能通过采用外部函数中定义的初始值来启动。
nonlocal
和 global
声明用于 词法 作用域——笼统地说,它们只关心源代码布局。
def swapPairs(head):
head = None # `head` in lexically outer scope <═╗
# ║
def helper(node): # ║
nonlocal head # nonlocal `head` for inner lexical scope >═╣
... # ║
head= nex.next # nonlocal applies to every use >═╝
return helper(node.next)
值得注意的是,作用域与代码的运行时嵌套完全无关;它不关心 helper
是否被 swapPairs
、一系列 helper
或一些不相关的函数调用:helper
中的名称 head
是完全等价的到 swapPairs
.
中的名字 head
这意味着 def helper
内的 head
将 始终 引用 swapPairs
调用内的 head
定义 def helper
。一旦第一次调用 helper
分配 head = nex.next
更改 head
inside swapPairs
和后续调用 helper
将看到(并修改)这个新值。
我写了一些代码,最近在编写函数的函数时遇到了 'nonlocal' 的需要(在处理递归时遇到了这个问题)。
例如:
def swapPairs(head):
head = None
def helper(node):
nonlocal head
...
head= nex.next
return helper(node.next)
我的问题很简单,因为我们调用递归函数 helper(node.next)
,然后循环回到 nonlocal head
- head
是否取 None 的值(由于非本地负责人)?或者它是否保留在之前的递归调用中分配给它的 head = nex.next
?
所以我试图了解 'nonlocal head'
是否会导致 head
始终采用外部函数中分配给它的任何值,或者情况并非如此?相反,它只是在内部函数中初始化 head 的一种方法,因此它只能通过采用外部函数中定义的初始值来启动。
nonlocal
和 global
声明用于 词法 作用域——笼统地说,它们只关心源代码布局。
def swapPairs(head):
head = None # `head` in lexically outer scope <═╗
# ║
def helper(node): # ║
nonlocal head # nonlocal `head` for inner lexical scope >═╣
... # ║
head= nex.next # nonlocal applies to every use >═╝
return helper(node.next)
值得注意的是,作用域与代码的运行时嵌套完全无关;它不关心 helper
是否被 swapPairs
、一系列 helper
或一些不相关的函数调用:helper
中的名称 head
是完全等价的到 swapPairs
.
head
这意味着 def helper
内的 head
将 始终 引用 swapPairs
调用内的 head
定义 def helper
。一旦第一次调用 helper
分配 head = nex.next
更改 head
inside swapPairs
和后续调用 helper
将看到(并修改)这个新值。