Python区分全局变量和局部变量,函数中变量作用域详解
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中一个十分重要的概念,合理使用全局变量和局部变量可以让代码更加简洁明了,同时也需要避免不同作用域之间变量重名的情况。
