'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 的一种方法,因此它只能通过采用外部函数中定义的初始值来启动。

nonlocalglobal 声明用于 词法 作用域——笼统地说,它们只关心源代码布局。

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将看到(并修改)这个新值。