• Python之函数-局部变量和global


    Python之函数-局部变量和global

    global语句

    • 使用global关键字的变量,将foo内的x声明为使用外部的全局作用域中定义的x
    • 全局作用域中必须有x的定义

    global使用原则

    • 外部作用域变量会在内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的 目的就是为了封装,尽量与外界隔离
    • 如果函数需要使用外部全局变量,请尽量使用函数的形参定义,并在调用传实参解决
    • 一句话:不用global。学习它就是为了深入理解变量作用域

    作用域:标识符的可见范围

    • 函数开辟了一个作用域,x被限制在当前函数作用域中,对外不可见
    • 全局的,函数外的变量,对内穿透
    • 本地使用标识符,优先使用当前作用域
    • 优先使用本地定义的局部变量,优先原则
    • 全局变量,如果所有函数都是用全局变量,局部作用域就没有用了。全局变量污染
    • 全局变量一般来说都是公用的,一般情况不要修改
    • 全局变量也是有作用域的,只不过是全局的,所以全局可见
    • 不要用global
    • 函数形参,调用时送入实参
    z = 100
    def fn1():
        print(z)
    
    # 定义一个函数fn1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    fn1()
    
    # 执行fn1函数
    # 返回结果:100
    
    • 1
    • 2
    • 3
    • 4
    del(z)
    
    # 删除z变量
    
    • 1
    • 2
    • 3
    z
    
    # 执行z变量
    # 报错内容:NameError: name 'z' is not defined
    
    • 1
    • 2
    • 3
    • 4
    z = 100
    def fn2():
        print(z)
        t = z + 1
        print(t)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    fn2()
    
    # 执行fn2
    # 返回结果:100
    # 返回结果:101
    
    • 1
    • 2
    • 3
    • 4
    • 5
    del(z)
    
    # 删除z变量
    
    • 1
    • 2
    • 3
    z = 100
    def fn3():
        print(z)
        m = z + 1
        print(m)
        z = z + 1
        print(z)
    
    # 定义变量fn3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    fn3()
    
    # 执行fn3
    # 报错内容:UnboundLocalError: cannot access local variable 'z' where it is not associated with a value
    
    • 1
    • 2
    • 3
    • 4
    del(z)
    
    # 删除z变量
    
    • 1
    • 2
    • 3
    z = 123
    def fn4():
        print(z) # z
        z += 1  
        print(z)
    
    # z的赋值语句 z = z+1,如果函数中出现 z=xxx赋值语句,z就是当前函数的局部变量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    fn4()
    
    # 报错内容:UnboundLocalError: cannot access local variable 'z' where it is not associated with a value
    
    • 1
    • 2
    • 3
    z = 111
    def fn6():
        z = 3000
        print(z)
        y = z + 1
        print(y)
    
    # 定义函数fn6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    fn6()
    
    # 执行fn6
    # 返回结果:3000
    # 返回结果:3001
    
    • 1
    • 2
    • 3
    • 4
    • 5
    z = 3333
    def fn7():
        global z # 声明z不再是局部的,而是全局变量
        print(z)
        z += 1
        print(z)
    
    # global 声明z不再是局部的,而是全局变量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    z
    
    # 返回结果:3333
    
    • 1
    • 2
    • 3
    fn7()
    
    # 返回结果:3333
    # 返回结果:3334
    
    • 1
    • 2
    • 3
    • 4
    z = 3333
    def fn7():
        global z 
        print(z)
        z += 1
        print(z)
        
    def fn8():
        global z
        z += 100
        print(z)
    
    # 如果多个函数都调用全局变量,都要修改,就带来了全局变量污染的问题,尽量不要使用全局变量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    fn7()
    
    # 返回结果:3333
    # 返回结果:3334
    
    • 1
    • 2
    • 3
    • 4
    fn8()
    
    # 返回结果:3434
    
    • 1
    • 2
    • 3
    z = 4444
    def fn10(x): # 形参一定是局部变量
        x += 1
        print(x)
    
    # 形参一定是局部变量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    fn10(z)
    
    # 函数调用了z,函数内x += 1 是4445,并不会改变变量z
    # 返回结果:4445
    
    • 1
    • 2
    • 3
    • 4
    z
    
    # z的值不会被修改
    # 返回结果:4444
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    【LeetCode-简答题】242. 有效的字母异位词
    IPv6通过公网共享文件(Windows)
    狼找兔子问题
    结构型设计模式之代理模式
    【教学类-35-03】学号+姓名+班级(小3班)学号字帖(A4竖版2份)
    系统架构设计师 2023年 综合知识
    【刷题】蓝桥杯
    软件测试行业到底有没有前景和出路?2022辞职后涨薪5K+,凭什么?
    SpringBoot简单入门
    手机如何投屏到电脑
  • 原文地址:https://blog.csdn.net/weixin_41224474/article/details/134339043