Python进阶|函数变量作用域

Python进阶|函数变量作用域_第1张图片
前言

在Python编程中,函数是我们接触较多的知识点,毕竟函数是用来节省代码量和提高程序效率很重要的一个手段。

首先,我们回顾下Python定义和使用函数的写法。

def sum(a,b):
    all = a + b
    return all

sum(1,2)

其中:

  • def是关键字,是函数的声明;
  • sum是函数名称,当然实际取名中,尽量取实际含义的名称,这样有利于代码的维护,也便于使用者的阅读;
  • 括号里的a和b是函数的参数;
  • 中间缩进的代码块就是函数的主体部分,是可执行的Python语句,用于实现一些功能,这里的功能就是求两个数之和;
  • 函数最后,可以返回结果(return和yield),也可以不返回;
  • 最后,使用函数名称,并传入相应的参数值,就可以调用函数了。
全局变量与局部变量

这两个名称解释起来还是很简单的,我们把函数外的变量叫做全局变量,而函数里面定义的变量则称为局部变量。

i = 1 #全局变量
def fun():
    j = 2 #局部变量

第一种情况:
函数里面使用全局变量,这个是没有问题的。

i = 1
def fun():
    print(i)

fun()
# 1

第二种情况:
在函数中修改全局变量,这种是会报UnboundLocalErro的错。原因是因为Python默认函数内部为局部变量,由于局部变量i没有声明,所以没法进行操作。

i = 1
def fun():
    i += 1
    print(i)

fun()
# UnboundLocalError: local variable 'i' referenced before assignment

这种情况下我们要使用global关键字,要进行声明i这个变量就是之前定义的全局变量i。

i = 1
def fun():
    global i
    i += 1
    print(i)

fun()
# 2

第三种情况:
局部变量和全局变量重名,我们来看看有什么有趣的事情会发生:

i = 1
def fun():
    i = 2
    print(i)

fun()
print(i)
#2
#1

有趣的事情发生了,从结果来看,当局部变量和全局变量重名,函数内部局部变量会将全局变量覆盖,而局部变量当函数调用完就被释放掉了,所以最后i的值还是全局变量i的值。

嵌套函数中的nonlocal

对于嵌套函数,内部函数要使用外部函数定义的变量,就需要用nonlocal这个关键字。

def outer():
    num = 10
    def inner():
        nonlocal num
        num = 100
        print('inner',num)
    inner()
    print('outer',num)

outer()
# inner 100
# outer 100
总结
  • 函数外的变量为全局变量,函数内的为局部变量,并且函数调用完局部变量会被释放;
  • global关键字用来在函数或其他局部作用域中使用全局变量;
    -nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。

你可能感兴趣的:(Python进阶|函数变量作用域)