Python函数与作用域:如何使用全局变量和局部变量?
在Python中,变量的作用域是非常重要的。对于一个变量,在全局和局部范围内的可用性并不相同。当你定义一个变量时,可以将这个变量定义在全局范围内或者是在某个函数内部的局部范围内。本文将介绍Python中函数与作用域的相关知识。
Python函数的作用域
通俗来说,作用域是程序中可以访问一个变量的区域。在Python中,有三种作用域。
1. 全局作用域
定义在程序模块中的变量具有全局作用域。可以在函数内和函数外访问这些变量。
x = 10
def foo():
print(x)
foo() # 输出10
2. 函数作用域
在函数内定义的变量有一个本地或函数作用域。这些变量只能在函数内部被访问。当函数被调用时,函数内部的变量被创建并且当函数完成执行时,这些变量被销毁。
def bar():
y = 20
print(y)
bar() # 输出20
3. 嵌套作用域
在一个函数内部定义的另一个函数也拥有嵌套作用域,因此可以访问外部函数中的变量。
def outer():
z = 30
def inner():
print(z)
inner()
outer() # 输出30
在Python中,变量具有LEGB规则。它是指解析顺序是从局部(scope)开始,然后依次向上搜索(Enclosing scope)、全局(Globa)、内置作用域(Built-in)。只有当变量不存在于这些作用域时才报错。
x = 40 # 全局作用域
def func():
x = 30 # 函数作用域
def inner():
x = 20 # 嵌套作用域
print(x)
inner()
print(x)
func() # 输出20, 30
print(x) # 输出40
全局变量和局部变量
在函数内部,可以使用全局变量和局部变量。全局变量是定义在函数外部且在整个程序中都可以被访问到的变量。而局部变量是只在函数内部使用的变量。
当你要改变一个变量的值时,Python会先查找局部作用域,在局部作用域中找到变量并更新它的值。如果在局部作用域中没有找到该变量,Python会到嵌套作用域中查找该变量并更新它的值。最后,如果在嵌套作用域和局部作用域中都没有找到该变量,Python会在全局作用域中查找它并更新它的值。如果在全局作用域中都没有找到该变量,则Python会抛出一个未定义变量的错误。
下面是一个示例,说明局部变量和全局变量的使用方法。
x = 50 # 全局变量
def func():
global x # 声明变量x为全局变量
print('x is', x)
x = 2 # 修改全局变量x的值
print('Changed global x to', x)
func()
print('Value of x is', x) # 输出修改后的全局变量x
在上面这个例子中,我们使用了global语句来改变全局变量x的值。如果我们不使用它,则会创建一个新的局部变量x并将其值设置为2,而原来的全局变量x仍然保持不变。
总结
在Python中,变量在不同的作用域中起着不同的作用。当你在函数内部定义一个变量时,这个变量被视为局部变量。如果你要在函数内部使用全局变量,则需要将其声明为global变量。Python中的作用域规则LEGB(局部、嵌套、全局和内置)决定了Python中变量的可用范围和行为。在编写程序时,一定要注意作用域规则。
