zoukankan      html  css  js  c++  java
  • python global nonlocal

    global: 

    方法之外在modual中的变量定义为全局变量。方法内的变量为局部变量。

     一般情况下,全局变量可以被使用,但是不应该被修改,不然会报错。

    不过一般不建议对全局变量做修改,如果有多个方法都对全局变量修改,会乱套的。

    例子(1):  

    global_var = 123
    
    
    def test():
        global_var = 1
        print(global_var)
    
    
    test()
    print(global_var)

    ---结果
    1
    123

    尽管global_var 定义了一个全局变量,但是test方法中的global_val为一个新的局部变量,只是两个名字一样而已,但是两个对象。因此可看到test内的print打印的是局部变量结果为1,test后的print为全局变量(局部变量只能在方法体内有效),结果为123。

    例子(2):

    global_var = 123
    
    
    def test():
        global_var += 1
        print(global_var)
    
    
    test()
    print(global_var)

    执行结果会报错:

    UnboundLocalError: local variable 'gloal_var' referenced before assignment

    因为test中的 global_val +=1 表示 global_val之前已经定义过,然后+1操作,但是在执行时,发现test中并未有局部变量global_val。因此报错,因全局变量没有被在test中声明。

    因此不能被修改。

    例(3):

    global_var = 123
    
    
    def test():
        print(global_var)
    
    
    test()
    print(global_var)

    结果----
    123
    123

    此时可以看到使用的是全局的global_val.

    例(4): 

    global_var = 123
    
    
    def test():
        global global_var
        global_var += 1
        print(global_var)
    
    
    test()
    print(global_var)
    结果---
    124
    124

    在test中定义global_val 为使用全局 global。因此全局的变量发生改变

     

    nonlocal: 方法中的子方法调用父方法中的变量。

         一般我们使用将父方法中的变量作为参数传入仅子方法中进行调用使用,

        使用这种的话就不需要调入直接可操作。

                     但这种限制了子方法仅仅对父方法的内部操作,扩展性差。

    def test():
        t_var = 23
        t_var += 1
        print(t_var)
        sub_test()
        print(t_var)
    
    
    def sub_test():
        nonlocal t_var
        t_var += 15
    
    
    test()
    
    ---结果:
    SyntaxError: no binding for nonlocal 't_var' found

    子方法必须定义在父方法中才可使用nonlocal,不然无效

    def test():
        t_var = 23
        t_var += 1
        print(t_var)
    
        def sub_test():
            nonlocal t_var
            t_var += 15
    
        sub_test()
        print(t_var)
    
    
    test()
    
    --------结果:
    29
    34

    以上这种形式就是那种面向过程的编程。

  • 相关阅读:
    常见协议及默认的端口号
    超级简单的防止表单重复提交
    Spring的IOC和AOP的作用
    通向财富自由之路一
    AngularJS2.0的特性
    Charles设置断点
    JMeter参数化之csv data set config常见的错误
    Jmeter的几种参数化方式
    java中关于String对象的解析
    题目2:数组中重复的数字
  • 原文地址:https://www.cnblogs.com/DennyZhao/p/8601021.html
Copyright © 2011-2022 走看看