python global 和 nonlocal 的理解

参考:

https://www.cnblogs.com/summer-cool/p/3884595.html

https://blog.csdn.net/xCyansun/article/details/79672634

对于global来说:

如果存在全局变量a,和函数 f 而函数f内部不存在 " a = expressions ",函数内部可以使用全局变量a;

示例代码如下:

代码

a = 10
def test1():
    b = a + 1
    print(b)
test1()

运行结果:

11

如果函数f内部存在 “a = expressions”, 那么有避免报错有两种方式:1.该表达式出现在函数使用变量a; 2.使用 global来声明该变量;

代码

a = 10
def test2():
    a = 12
    print(a)
test2()

运行结果:

12

代码

a = 10
def test2():
    print(a)
     a = 12
test2()

运行结果:

UnboundLocalError: local variable ‘a‘ referenced before assignment

代码

a = 10
def test2():
    global a
    print(a)
    a = 12
test2()

运行结果:

12

对于nonlocal来说:

主要用于让函数内部定义的函数访问外层函数定义的变量。

代码:

def outer():
    num = 1
    def inner1():
        print("inner1: %d" % (num))
        def inner2():
            nonlocal num = 3
            print("inner2: %d" % (num))
        inner2()
    inner1()
    print("outer: %d" % (num))
outer()

运行结果:

inner1: 1

inner2: 3

outer: 3

nonlocal所声明的变量必须在当前函数的外层函数定义,如果外部函数仅仅使用global声明全局变量,这种方式会报错:

代码:

def outer():
    num = 1
    def inner1():
        print("inner1: %d" % (num))
        def inner2():
            nonlocal num
            num = 3
            print("inner2: %d" % (num))
        inner2()
    inner1()
    print("outer: %d" % (num))
outer()

运行结果:

SyntaxError: no binding for nonlocal ‘num‘ found

原文地址:https://www.cnblogs.com/lif323/p/10292072.html

时间: 2024-08-01 19:16:54

python global 和 nonlocal 的理解的相关文章

Python Global和Nonlocal的用法

nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当前代码块. 这意味着列出的标识符将被解释为全局变量. 尽管自由变量可能指的是全局变量而不被声明为全局变量. global语句中列出的名称不得用于该全局语句之前的文本代码块中. global语句中列出的名称不能定义为形式参数,也不能在 for 循环控制目标.class定义.函数定义.import语句或

python global vs nonlocal (2)

上一篇中简述了这两个关键字的基本用法: global用于在局部作用于修改或重定义全局变量 nonlocal用于在内部作用域修改或重定义外部变量(全局变量除外) 这只是很浅的理解方式 注意python的特性,变量有mutable和immutable之分,对于mutable变量的,在内部作用域内做修改时完全可以的,不需要上面两个关键字的修饰,比如下面的程序: a = 12li = [1, 2, 3]def g():    b = 11    li[2] = 4   #li变量在内部作用域内被修改了 

python中global 和 nonlocal 的作用域

python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 . 一 global global关键字用来在函数或其他局部作用域中使用全局变量.但是如果不修改全局变量也可以不使用global关键字. 1 gcount = 0 2 3 def global_test(): 4 gcount+=1 5 print (gcount) 6 global_test() D:\Python34\python.exe E:/PycharmProje

python(动态传参、命名空间、函数嵌套、global和nonlocal关键字)

一.函数的动态传参 1.*args位置参数动态传参 def chi(*food): print(food) chi("烧烤","火锅","虾吃虾涮","烤鱼") 多个位置参数传递进去,收到的内容是元组tuple,动态参数的位置必须要在位置参数后面 2**kwargs 关键字参数动态传参 def chi(**food): print(food) chi(zhangqing="吃点好的",lianda=&quo

python globals()和locals(),global和nonlocal,以及闭包

1. 命名空间和作用域 命名空间 1. 内置命名空间: python解释内部运行时的变量函数 2. 全局命名空间: 我们在py文件中直接声明出来的变量, 函数 3. 局部命名空间: 在函数内部声明的变量和函数 作用域: 1. 全局作用域: 内置 + 全局 2. 局部作用域: 局部 globals() 查看全局作用域中的名字 locals() 查看当前作用域中的名字 2. global和nonlocal global: 把全局变量拿到局部来用. nonlocal:把离他最近的一层的变量拿过来, 不

python学习第十天,名称空间与作用域,函数的嵌套,global 和 nonlocal

名称空间: 内置名称空间: 在打开pytharm是加载 全局名称空间: 在运行py文件是加载 局部名称空间(临时名称空间) :在py文件中调用时加载 def func(): ----->函数定义 pass ------->函数体 func()------------->函数调用 函数定义时:内存中只储存与函数名的对应关系,函数体的内容不储存 函数调用时:才执行函数体的内容,创建临时空间,随着函数执行结束,内存中的临时名称空间里面的内容也清空 作用域: 全局作用域:内置名称空间里的内容+全

Python全栈__动态参数、名称空间、作用域、作用域链、加载顺序、函数的嵌套、global、nonlocal

1.动态参数 当实参数量与形参数量相等时,参数传递正常. def func1(a, b, c): pass func1(1, 2, 3) 当实参数量与形参数量不相等时,则会报错. def func1(a, b, c): pass func1(1, 2, 3, 4, 5, 6, 6) 用户传入到函数中的实参数量不确定时,或者为了以后扩展,此时要用到动态参数 *args  **kwargs(万能参数). 顺序: 位置参数,*args,默认参数,**kwargs 1.*args *args是接收的是所

Python之函数(四)函数的嵌套和global、nonlocal

函数的嵌套 函数的嵌套 def func() print(1) def f1(): print(2) return f1() func() 结果为:1 2 不管在什么位置,只要是函数+()就是在调用此函数 函数调用执行后,函数体中开辟的空间就自动销毁了 def func(): a=1 def foo(): b=2 print(b) print(a) def f1(): print(b) return f1() return foo() print(func()) 结果为:2 1 2 None p

global与nonlocal

global与nonlocal:   global关键字:   x=1 def foo(): x=10 print(x)     #打印: 10 foo() print(x)          #打印:  1 #############>>>局部的x不会影响全局的x x=1 def foo():                        #使用global关键字,在局部修改全局变量 global x x=10 print(x)     #打印: 10 foo() print(x)