欢迎访问宙启技术站
智能推送

掌握Python函数中的变量作用域

发布时间:2023-06-23 09:50:21

Python中函数中的变量作用域(scope)是每一个python开发人员都应该掌握的基本概念。变量作用域指的是一个变量被定义和有效的部分。

在Python中,有三种变量作用域:

1. 全局作用域(global scope):在整个程序中都有效。

2. 局部作用域(local scope):存在于函数内部,只在函数内部有效。

3. 内嵌作用域(enclosing scope):在函数内部嵌套函数的情况下存在,包含于局部作用域与全局作用域之间。

在一个Python程序中,不同的变量作用域可以包含同名的变量。

在Python中,如果尝试在一个变量作用域中访问不存在的变量,就会引发NameError异常。

变量作用域的规则可以概括为:

- 在函数中,如果一个变量是在函数内部被定义的,那么它的作用域只是函数内部

- 在函数中,如果一个变量在函数内部没有被定义,但在函数外部有定义,那么在函数内容,这个变量就是全局变量

- 在函数中,如果一个变量在函数内部被定义,但又需要在函数外部访问,那么需要使用global关键字声明这个变量为全局变量

- 在嵌套的函数中,如果要引用外部函数中的变量,需要使用nonlocal关键字

接下来,我们来看一些例子,更好地理解Python中的变量作用域。

1. 全局作用域

在全局空间中定义的变量是全局变量,可以在程序的任何地方使用。

x = 100
 
def f():
    print(x)
 
f() # 输出 100

上面的代码中,x是全局变量,可以在f函数中使用。

2. 局部作用域

在函数内部定义的变量是局部变量,只在函数内部有效。

def f():
    x = 100
    print(x)
 
f() # 输出 100
print(x) # 报错 NameError: name 'x' is not defined

在上面的例子中,x是函数f的局部变量,而不是全局变量,在函数外部无法访问。

3. 内嵌作用域

当一个函数嵌套在另一个函数中时,内部函数可以访问外部函数的局部变量,但是不能修改它。

如果存在同名变量,内部函数将使用最近的变量。

def f1():
    x = 100
    def f2():
        y = 200
        print(x,y)
    f2()
 
f1() # 输出 100 200

在上面的例子中,x是f1函数的局部变量,y是f2函数的局部变量。f2函数在访问x变量时,它会在函数f1的作用域中查找这个变量。

4. global变量

当需要在一个函数内部修改全局变量时,需要使用global关键字声明这个变量为全局变量。

x = 100
 
def f():
    global x
    x = 200
    print(x)
 
f() # 输出 200
print(x) # 输出 200

在上面的例子中,函数f中使用了关键字global,意味着声明x变量是全局变量。这样就可以在函数f中修改x值,也就是修改全局变量x的值。

5. nonlocal变量

当需要在嵌套函数中访问外部函数的变量时,需要使用nonlocal关键字。

def f1():
    x = 100
    def f2():
        nonlocal x
        x += 1
        print(x)
    f2()
 
f1() # 输出 101

在上面的例子中,函数f2使用了关键字nonlocal,表示在嵌套函数中使用x变量,而不是新定义一个变量。

总结

以上就是Python函数中的变量作用域的基本介绍。 在编写Python代码时,必须清楚变量所在的作用域,这可以帮助快速排除大量错误,并有助于优化程序。