del 删的是标识符,使其引用计数清零
闭包
闭包:就是一种概念,出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就形成了闭包.
JavaScript也有这个概念
自由变量:
未在本地作用域中定义的变量
def counter():
c = [0]
def inc():
c[0] += 1
return c[0]
return inc
foo = counter() # callable\function
print(type(foo))
print(type(foo()))
print(foo(),foo())
c = 100
print(foo())
运行结果
为什么第二行的c = [0]一直存活按道理是应该直接消亡了,因为foo=counter(), 函数inc被我们一直引用了,如果连引用都没有那么
def inc():
c[0] += 1
return c[0]
这个函数也就消失了.而函数inc内部使用的是外层函数的自由变量,所以也导致外层自由变量也没有消亡.
nonlocal关键字
使用了nonlocal关键字,将变量标记为在上级的局部作用域中定义,但不能是全局作用域中定义
def counter():
count = 0
def inc():
nonlocal count
count +=1
return count
return inc
foo = counter() # callable\function
print(foo())
print(foo())
通过nonlocal能够方便的使用上一级作用域的局部变量
LEGB变量名解析原则
LEGB原则总结:就是一句话从本级逐级向外层找