本文共 1214 字,大约阅读时间需要 4 分钟。
在做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 其实就是告诉编译器,我需要使用上文中的那个变量。
转载地址:http://dnywi.baihongyu.com/