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

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

原文地址:https://www.cnblogs.com/DennyZhao/p/8601021.html