美文网首页
01.05 笔记 - 函数作用域

01.05 笔记 - 函数作用域

作者: xxxQinli | 来源:发表于2019-01-05 17:06 被阅读0次

    什么是变量的作用域

    变量能够使用的范围

    全局变量和局部变量

    • a. 全局变量 - 没有声明在函数或者类中的变量都是全局变量,函数、循环里都可以使用,全局变量的作用域从声明开始,到整个文件结束

    • b. 局部变量 - 声明在函数或者类中的变量就是局部变量,只在函数与类中,局部变量的作用域是从声明开始,到函数结束

    • 总结:当我们在调用函数的时候,系统会自动在栈区间专门为函数开辟一块独立的开辟空间,用来保存在函数中声明的变量(形参也是属于声明在函数中的变量),当函数调用结束后,这个函数对应的栈区间会自动销毁 -- 函数调用过程就是一个压栈过程


    全局变量

    • 变量a是全局变量

    a = 100

    • 全局变量 - for in中 ----- 重点

    for y in range(5):
    
     print(y)
    
    \# y 可以在循环外中使用,y为全局变量,但是y以最后一次赋值为准
    
    def func1():
    
     print(y)
    
    func1()
    
    print(y)
    
    

    局部变量

    • a. 函数的形参就相当于声明在函数中的变量,所以是局部变量
    
    #num1 是局部
    
    """
    
    def func2(num1):
    
     print(num1)
    
    func2(10)
    
    \# print(num1) 报错
    
    
    • 如果全局变量和局部变量重名,那么在局部变量的作用域中使用的是局部变量,相当于在局部变量中重新声明了一个变量,外面使用的是全局变量
    
    aa = 100
    
    def func5():
    
     aa = 200
    
     print('函数里', aa)
    
    func5()
    
    print('外部', aa)
    
    

    重点 - global - 在函数中声明了一个全局变量,不需要一定在全局中有这个变量

    在函数中:

    global 变量名 (global只能在函数中使用)

    变量名 = 值

    重点 - 创建函数,其实是创建一个函数的单独的空间,在这个空间里给局部变量赋值,函数执行结束后,函数的单独空间销毁

    重点 - 若用globl在函数中指定全局变量,函数会先在全局中找是否又这个变量,有就用全局变量,没有的话,就重新在全局变量中声明一个新的变量

    
    \# print(cc)
    
    bb = 11
    
    def func6():
    
     global bb
    
     bb = 22
    
     print(bb)
    
     global cc
    
     cc = 200
    
    func6()
    
    print(bb) \# 全局变量被修改了
    
    print(cc)
    
    

    重点 - nonlocal - 想要在局部的局部中去修改局部变量的值,就使用nonlocal对变量进行说明,前提,父函数里必须要有这个变量

    在子函数中使用,将变量不当做局部函数(不重新声明一个变量),而用父函数的这个变量,若父函数没有,就报错SyntaxError: no binding for nonlocal 'abc' found

    
    def func11():
    
     abc = 123
    
     print('func11', abc)
    
     def func12():
    
     nonlocal abc \# abc 为父函数里的同名变量
    
     abc = 333
    
     print('func12', abc)
    
     func12()
    
     print('func11', abc)
    
    func11()
    

    
    list1 = []
    
    for i in range(1,6):
    
     list1.append(lambda x: x + i)
    
    print(list1)
    
    print(list1[0](2)) 
    

    重点-在将函数添加进列表的时候,只是将一个函数块放入列表,只有当函数要调用的时候,才会执行函数块中的代码,根据代码情况调用里面的变量

    简单意思就是,只是存入了一个函数块,并不会执行代码块,当要调用的时候,才会执行里面的函数

    相关文章

      网友评论

          本文标题:01.05 笔记 - 函数作用域

          本文链接:https://www.haomeiwen.com/subject/hpcdrqtx.html