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

Python区分全局变量和局部变量,函数中变量作用域详解

发布时间:2023-06-19 02:55:40

Python作为一种强类型动态语言,具有自动垃圾回收功能,其变量作用范围可以分为全局作用域和局部作用域。在Python中变量的作用范围可以是整个程序,也可以只在某个函数内部。

一、全局变量和局部变量

全局变量可以在程序的任何地方被访问,而局部变量只能在定义它的函数内部被访问。当在函数内部引用变量时,Python首先查找本地变量,在没有找到时,再查找全局变量。如果都没有找到,则会引发NameError异常。

示例代码:

a = 10  # 全局变量

def test():
    b = 20  # 局部变量
    print(a, b)

test()

print(a)

输出结果:

10 20
10

在上述示例中,变量a为全局变量,在函数中可直接访问;变量b为局部变量,只能在函数内部访问。在函数中打印变量a时,可以直接引用,而打印变量b则需要在函数中定义并传递参数。

二、变量作用域

Python中的变量作用范围是有明确规定的,一般有以下几种情况:

1、全局变量

在函数外定义的变量属于全局变量,可以在程序的任何地方被访问,甚至在函数内部引用也没有问题。但是,如果在函数内部进行赋值操作,Python会将其视为新的局部变量,而不是改变全局变量的值。

示例代码:

a = 10  # 全局变量

def test():
    a = 5
    print("函数内部a:", a)

test()

print("函数外部a:", a)

输出结果:

函数内部a: 5
函数外部a: 10

在上述示例中,函数内部定义了与全局变量同名的变量a,并对其赋值,但并未改变全局变量的值,只是在函数内部新定义了一个局部变量。

2、局部变量

在函数内部定义的变量属于局部变量,只能在该函数内部被访问。当函数调用结束后,局部变量也会随之销毁。

def test():
    a = 10  # 局部变量
    print(a)

test()

print(a)

输出结果:

10
NameError: name 'a' is not defined

在上述示例中,变量a是在函数内部定义的局部变量,在函数中可以直接访问,但是在函数外部无法直接访问,会引发NameError异常。

3、函数内部修改全局变量

虽然在函数内部无法直接修改全局变量的值,但是可以使用global关键字定义全局变量,以便在函数内部修改其值。

示例代码:

a = 10  # 全局变量

def test():
    global a
    a = 5
    print("函数内部a:", a)

test()

print("函数外部a:", a)

输出结果:

函数内部a: 5
函数外部a: 5

在上述示例中,使用global关键字定义了全局变量a,并在函数内部对其进行修改。此时无论在函数内部还是函数外部访问变量a,其值都被修改为5。

4、函数内部访问嵌套作用域中的变量

在Python中,如果在一个函数内部定义了另一个函数,而这个函数又引用了外部函数中的变量,外部函数中的变量会被自动绑定为内部函数的嵌套作用域。在内部函数内部访问外部函数中的变量时,要使用nonlocal关键字修饰。

示例代码:

def outer():
    x = "hello"

    def inner():
        nonlocal x
        x = x + " world"
        print("inner x:", x)

    inner()
    print("outer x:", x)

outer()

输出结果:

inner x: hello world
outer x: hello world

在上述示例中,内部函数inner访问了外部函数outer中的变量x,并对其进行了修改。需要注意的是,如果在内部函数中直接修改该变量,会被认为是新定义一个同名的局部变量,需要使用nonlocal关键字修饰才能正确访问。

总之,变量作用域是Python中一个十分重要的概念,合理使用全局变量和局部变量可以让代码更加简洁明了,同时也需要避免不同作用域之间变量重名的情况。