函数--变量作用域

函数是代码重用最基本的部件
定义函数:Python使用def关键字定义函数
def 函数名(参数1,参数2):
  xxx

变量作用域

Python变量作用域一共有4种

L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域

以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找
Python中,def/class/lambda中赋值的变量,其作用域为局部作用域,且三者的身份相同,故,类中函数要调用类中赋值变量,需增加self前缀
要点:
1.函数可直接调用全局变量

name = 1
def fun():
    print(name)
if __name__ == "__main__":
    fun()
>>>1

2.函数中赋值和全局变量同名的变量,此时函数内变量为新局部变量,故使用前需先赋值;在函数作用域中,局部变量覆盖同名全局作变量,但不会影响全局变量

name = 1
def fun():
    print(name)
    name = 0
if __name__ == "__main__":
    fun()
>>>Traceback (most recent call last):
  File "test.py", line 7, in 
    fun()
  File "test.py", line 3, in fun
    print(name)
UnboundLocalError: local variable 'name' referenced before assignment
# name此时为局部变量
name = 1
def fun():
    name = 0
    print(name)
if __name__ == "__main__":
    fun()
>>>0

3.局部作用域中想对全局变量赋值,或者想在局部作用域中生成全局变量,使用global关键字

# Python执行时,即使调用的函数,也会先执行函数外部的其他语句,再执行函数
# 故fun()执行前,会先打印1,然后执行了fun,在执行print打印name
name = 1
def fun():
    global name 
    name = 0
print(name)
if __name__ == "__main__":
    fun()
    print(name)
>>>1
>>>0

4.函数中可以嵌套函数,特殊场景为闭包
闭包:引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外,如下

def A():
    param=1
    def B():
        param1=param
        print(param1)
    return B
if __name__ == '__main__':
    A()()
>>>1

B为A嵌套函数,B中引用外部函数变量(即上文中自由变量);
调用函数A,返回函数B实例(返回函数B即称闭包),此时变量param被记住。即A函数调用结束(局部变量函数调用后即时失效),param变量依然存在

global和nonlocal

global:函数中若想修改全局变量,需使用该关键字声明
nonlocal:允许嵌套def对其外部函数中变量赋值(一般只引用)且这个变量需已在外层被赋值过,而非在嵌套def中初始赋值

你可能感兴趣的:(函数--变量作用域)