📜  函数范围(1)

📅  最后修改于: 2023-12-03 15:22:37.506000             🧑  作者: Mango

函数范围

在编程中,函数范围是指函数可见的代码区域。在函数中声明的变量和函数只能在函数范围内使用,也就是说,在函数外部无法使用。

局部变量

局部变量是在函数范围内声明的变量,只能在函数内部使用。如果尝试在函数外部使用局部变量,将会产生一个错误。

def my_func():
    x = 1   # 局部变量
    return x

print(my_func())    # 输出 1
print(x)    # 产生NameError

在上面的代码中,x是my_func()函数中的局部变量,只能在函数内使用。尝试在函数外部使用x将会产生一个NameError。

全局变量

全局变量是在函数外部声明的变量,并且可以在整个程序中使用。在函数内部可以使用全局变量,但是必须使用global关键字声明。

x = 1    # 全局变量

def my_func():
    global x
    x = 2    # 改变全局变量的值
    return x

print(my_func())    # 输出 2
print(x)    # 输出 2

在上面的代码中,x是全局变量,可以在函数内部访问。但是在函数内修改全局变量的值将会改变全局变量的值。为了在函数内部修改全局变量的值,需要使用global关键字声明。

内嵌函数

函数范围还可以包含更多的函数,这些函数被称为内嵌函数。内嵌函数可以访问当前函数的变量,并返回一个新的函数。

def outer_func(x):
    def inner_func(y):
        return x + y
    return inner_func

new_func = outer_func(10)

print(new_func(5))    # 输出 15

在上面的代码中,outer_func中包含一个内嵌函数inner_func,inner_func可以访问outer_func中的变量x,并返回一个新函数。当outer_func(10)被调用时,它返回inner_func,new_func将引用inner_func。调用new_func(5)将返回15,这是由inner_func中的x + y计算得出的。

闭包(closure)

闭包是一种特殊的内嵌函数,它“记住”了它被创建时的范围。当内嵌函数返回时,它将其范围与函数一起“包含”在返回的函数中。

def outer_func(x):
    def inner_func(y):
        return x + y
    return inner_func

new_func = outer_func(10)
print(new_func(5))    # 输出 15

# 再次调用 outer_func 并获得一个新函数
new_func2 = outer_func(20)
print(new_func2(5))    # 输出 25

在上面的代码中,outer_func返回它的内嵌函数inner_func。当outer_func(10)被调用时,它返回一个与x(即10)相关联的inner_func新函数。当outer_func(20)被调用时,它返回另一个新函数,并与x(即20)相关联。由于inner_func包含了它被创建时的范围,所以每个返回的新函数都有与其关联的唯一x值。当new_func(5)和new_func2(5)被调用时,它们分别返回15和25,这是由于它们使用不同的x值计算得出的。