掌握Python函数中的变量作用域
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代码时,必须清楚变量所在的作用域,这可以帮助快速排除大量错误,并有助于优化程序。
