文章目录
1.引子
刷题遇到了这个回文链表的题目,其中解答需要用到nonlocal这个关键字,不然在inner function中会显示没有left这个变量
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
left = head
def traverse(right):
if not right:
return True
nonlocal left
res = traverse(right.next)
res = res and right.val == left.val
left = left.next
return res
return traverse(head)
2.nonlocal的作用
对比两段函数
def myfunc1():
x = "John"
def myfunc2():
x = "hello"
myfunc2()
return x
print(myfunc1())
上面这段没有nonlocal, x 在func2中是 local variable, 所以不会改变func1中的x所以输出的是John
def myfunc1():
x = "John"
def myfunc2():
nonlocal x
x = "hello"
myfunc2()
return x
print(myfunc1())
而这段函数在inner function中有 nonlocal 关键字修饰x,这时在func2中修改x是会使x发生变化的, 所以输出的是hello.
上面引子的例子里, 随着right 的左移, left也要跟着右移, 如果没有nonlocal修饰, 首先会报错找不到left.val, 其次left = left.next也不会改变函数外的left