目录
1.作用域分类
作用域分为局部作用域和全局作用域。
1.1局部作用域
如果一个变量定义的位置是在函数的里面,则该变量的作用域仅限于函数,同时该变量也称为局部变量。例如:
def myfunc():
a = 233
print(a)
myfunc()#调用函数
>>>233
myfunc(a)#调用函数并且访问函数里面的变量a
>>>Traceback (most recent call last):
File "<pyshell#73>", line 1, in <module>
myfunc(a)
NameError: name 'a' is not defined
当调用函数的局部变量的时候,则会出现报错,例如以上代码中的myfunc(a)。
1.2全局作用域
如果在任何函数的外部去定义一个变量,那么该变量的作用域则为全局作用域,该变量称为全局变量。例如:
a = 233
def myfunc():
print(a)
myfunc()
>>>233
此外,当局部变量和全局变量的变量名相同时,局部变量会覆盖全局变量,当我们调用全局变量的时候,局部变量就会失效。
例如:
a = 233
def myfunc():
a = 332
print(a)
myfunc()
>>>332
print(x)
>>>233
注意:虽然局部变量和全局变量的变量名相同,但是两个变量并不相同。
2.嵌套函数
嵌套函数表示定义一个函数的时候,函数体里还能定义另一个函数。
例如:
def funca():
n = 1
def funcb():
m = 2
print("函数b的值为",m)
print("函数a的值为",n)
funca()
>>>函数a的值为 1
以上代码表示对funca()函数进行调用,又因为该函数为嵌套函数,故继续调用funcb()函数,直接输出funcb()函数的值。
注意:不能直接调用嵌套函数内的函数,否则会进行报错。
但是可以在函数里面对嵌套函数进行调用,例如:
def funca():
n = 1
def funcb():
m = 2
print(m)
funcb()
print(n)
funca()
>>>2
>>>1
由此程序可知内部函数funcb()可以访问外部函数的变量n,但却不可以修改外部变量,此时我们可以使用nonlocal语句就可以实现僭越。
例如:
def funca():
x = 233
def funcb():
nonlocal x#使用nonlocal语句对变量x变为自由变量,即可被修改
x = 332
print("In funcb,x=",x)
funcb()
print("In funcb,x=",x)
funca()
>>>In funcb,x= 332
>>>In funcb,x= 332
def funca():
x = 233
def funcb():
x = 332
print("In funcb,x=",x)
funcb()
print("In funcb,x=",x)
funca()
>>>In funcb,x= 332
>>>In funcb,x= 233
3.LEGB规则
Local 可能是在一个函数或者类方法内部,即函数的内部变量(局部变量)。
Enclosed 可能是嵌套函数内,比如说 一个函数包裹在另一个函数内部,即嵌套函数里面比较外层的变量(相对于最里面一层)。
Global 代表的是执行脚本自身的最高层次,即函数的全局变量。
Built-in 是Python为自身保留的特殊名称。
其中,Local -> Enclosed -> Global -> Built-in,即在程序执行的过程中变量考虑的优先级。