3.关于作用域知识的额外补充global和nonlocal关键字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.关于作用域知识的额外补充global和nonlocal关键字相关的知识,希望对你有一定的参考价值。

本遍文章对global关键字和nonlocal关键字进行补充,这两个关键字在以后做python开发的时候,能不用尽量别用!最好别用!总会出现让你意想不到的后果...


1.先说第一种global,不管在任何作用域下,只要是使用global声明的变量,都会变为全局变量。

直接上例子。

首先是不使用global声明变量。

x = 1

def f1():

    x = "suhaozhi"

    print x

def f2():

    x = "hamasakiayumi"

    print x

f1()

>>> suhaozhi

f2()

>>> hamasakiayumi

print x

>>>1


函数查找变量的默认规则就是,先找函数内部,当本层函数内部没有这个变量,才会去外部作用域去一层一层去找,一直找到全局作用域,如果在本层找到了,就以本层内部的变量为准,上面的例子就很好的印证了这一点。


当使用了global声明变量为全局变量后,函数中的内部变量就会变为全局变量,如果变量名相同,甚至可以改变全局变量。

x = 1

def f1():

    global x

    x = "suhaozhi"

    print x

def f2():

    x = "hamasakiayumi"

    print x

f1()

>>>suhaozhi

f2()

>>>hamasakiayumi

print x

>>>suhaozhi

#在最后可以看到,全局变量x的值被f1函数改变了,原来x = 1,现在x = “suhaozhi”。


2.nonlocal 修改(覆盖)上层函数的变量。注意!!!这种nonlocal声明在python2.x版本是不支持的!!!只有python3以上才支持。

def f1():

    x = 1

    print (x)

    def f2():

        nonlocal x

        x = 2

        print (x)

    f2()

    print (x)

f1()

>>>1

      2

      2

f2函数中的x变量替换掉了f1函数中的x变量。




本文出自 “reBiRTH” 博客,请务必保留此出处http://suhaozhi.blog.51cto.com/7272298/1907649

以上是关于3.关于作用域知识的额外补充global和nonlocal关键字的主要内容,如果未能解决你的问题,请参考以下文章

JS额外知识补充:with语句&eval语句&严格模式

关于 global nonlocal 用法

函数参数补充名称空间与作用域global与nonlocal

面向对象之元类介绍

四 闭包函数装饰器

python基础--函数全解析