0

我写了一些代码,最近在编写函数的函数时遇到了“非本地”的需求(在处理递归时遇到了这个问题)。

例如:

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

4

1 回答 1

2

nonlocalandglobal声明用于词法作用域——松散地说,它们只关心源代码布局。

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、s 序列helper还是一些不相关的函数调用:head里面的名字helper完全等同于head里面的名字swapPairs

That means the head inside def helper will always refer to the head inside the swapPairs call that defined def helper. Once the first call to helper assigns head = nex.next that changes the head inside the swapPairs and subsequent calls to helper will see (and modify) this new value.

于 2021-07-14T12:47:03.130 回答