global关键字
global适用于函数内部修改全局变量的值。这句话怎么理解?我们用代码来直观的解释一下。
如上图,我们想要在函数内部修改全局变量x的值,运行代码后报错,翻译一下报错内容,意思是“局部变量'x'在赋值前被引用”。换句话说就是x是个局部变量,在改变它的值之前x没有被定义(没有被初始化赋值)。
有人会问,上面不是定义了全局变量x吗?这是因为在函数内部可以引用全局变量的值,但是不能修改全局变量的值。如果要在函数内部修改全局变量x的值,那就得在函数内部用global修饰x,就是告诉解释器,现在函数内部这个x和全局变量x是同一个引用了,可以随意改变了。我们来看下图中的代码示例
同理,如果在最上面没有定义全局变量x,直接在函数内部用global修饰了局部变量x,那么在函数外部也是可以调用变量x的,因为此时x是全局变量了,如下图代码所示
继续看,如果在函数f1()中用global修饰了x,那么想在函数f2()中如果想更改x的值,该怎么办呢?此类情况和第一种情况是一样的,只需要在f2()中用global修饰x即可,继续看代码示例
nonlocal关键字
nonlocal适用于嵌套函数中内部函数修改外部变量的值。嵌套函数?很好理解,就是一个函数里面还有一个函数。如下图可以看到,在嵌套函数f2()中,是可以直接调用外部变量x。但是如果要对x的值进行修改,那么就会报错。且报错内容与global中第一个示例相同。
那么要在f2()中修改外部变量x的值,我们就得用nonlocal关键字来修饰x,修饰后就是告诉解释器,此x和外部的x是同一个变量了,而不是在f2的内存中新建的x,如下图代码示例
如果f2()的外部没有定义x,在f2()中直接用nonlocal修饰x,那么就会报错,如下图,所以要注意,这一点nonlocal是和global不同的地方。
更多文章请关注公众号:python时间到