在做leetcode的时候,遇到一个小细节:
我想在 fun 中定义一个fun,然后再递归调用:
例如,一个binary search 的例子:
def searchRange(self, nums: List[int], target: int) -> List[int]:
lb, rb = -1, -1
left, right = 0, len(nums)-1
def find(left,right,target):
nonlocal lb, rb #
if left > right : return
else:
mid = int(left + (right - left) / 2)
if nums[mid] > target:
find(left,mid-1,target)
if nums[mid] < target:
find(mid+1,right,target)
if nums[mid] == target:
if lb == -1 or rb == -1:
lb = rb = mid
else:
if mid < lb:
lb = mid
if mid > rb:
rb = mid
find(left,mid-1,target)
find(mid+1,right,target)
find(left,right,target)
return list((lb,rb))
如果我想在find 函数中,用到searchRange 函数中的变量 lb,rb的时候,我需要在 find函数中对这两个变量 lb , rb
进行操作, 给定关键字 nonlocal
在我后续的学习过程中,我知道原来python解释器在处理变量的时候,如果没有出现会去上下文中寻找,如果不需要对这个变量赋值的话,这个变量就利用闭包的特性可以直接使用,如果需要赋值,那么变量会被解释器视作 局部变量,就没有与上文的变量绑定了。使用nonlocal 其实就是告诉编译器,我需要使用上文中的那个变量。