注:每周一到周五都会进行相关Python基础知识更新,欢迎大家提宝贵的意见
先给大家讲解下,python解释器对表达式中的变量的引用,顺序遍历各作用域。
1)、当前函数作用域
2)、任何外围作用域(包含当前函数的其他函数)
3)、包含当前代码的那个模块的作用域(也叫全局作用域,global scope)
4)、内置作用域(也就是包含len及str等函数的那个作用域)
如果以上这些地方都没有定义过名称相同的变量,则就会抛出NameError异常。
请看下面例子:请使用python3以上版本
>>> def f1(x,y):
flag = False######scope:f1
def f1_1(x):
if x in y:
flag = True#####scope:f1_1
return (0,x)
return (1,x)
x.sort(key=f1_1)
return flag
>>> a = [1,2,3,4,5,6]
>>> b={1,2,3}
>>> f1(a,b)
False
>>>
==================================================
def f1(x,y):
flag = False######scope:f1
def f1_1(x):
if x in y:
nonlocal flag
flag = True#####scope:f1 not f1_1
return (0,x)
return (1,x)
x.sort(key=f1_1)
return flag
>>> a = [1,2,3,4,5,6]
>>> b={1,2,3}
>>> f1(a,b)
True
>>>
总结:
nonlocal::如果在闭包内给该变量赋值,那么修改的其实是闭包外那个作用域中的变量,它不会延伸到模块级别。
global:用来便是对该变量的赋值操作,将会直接修改模块作用域里的那个变量