Python函数中的局部变量和全局变量有什么区别?
Python中局部变量和全局变量的区别是很重要的一个概念,因为它们分别用于函数内和函数外的作用域。局部变量只在函数内有效,而全局变量在整个程序中都有效。以下将对它们进行详细介绍。
1. 局部变量
局部变量是在函数内部声明的变量,只在函数内部有效,并且函数执行完毕后,局部变量会被自动销毁。局部变量只能在声明它的函数内(嵌套的函数除外)使用,其他函数无法访问该变量。下面是一个局部变量的例子:
def func():
x = 10
print(x) # 输出10
func()
print(x) # 报错,因为x是局部变量,无法在函数外访问
上面的代码中,变量x的作用域只在函数内部,因此在函数外部无法访问。
2. 全局变量
全局变量是在函数外部声明的变量,其作用域是整个程序内部。全局变量可以在任何函数中被使用,并且对程序中所有函数均有效。下面是一个全局变量的例子:
x = 10 # 在函数外部声明全局变量
def func():
print(x) # 输出10
func()
print(x) # 输出10
在上面的代码中,变量x是全局变量,它可以在任何函数中被使用,包括声明在函数内的函数。
3. 全局变量和局部变量命名的优先级
在Python中,局部变量在函数内部优先级要高于全局变量。如果函数内部同时有局部变量和全局变量,函数会优先使用局部变量,而不会使用同名的全局变量。例如:
x = 10
y = 20
def func():
x = 5
print(x) # 输出5
func()
print(x) # 输出10
在上面的代码中,函数内部声明了一个变量x,因此在调用函数func时,会输出5,而不是10。函数外部的x依旧是全局变量,不会受到函数内部x的影响。
4. 变量作用域的查找顺序
在Python中,变量的作用域遵循LEGB规则,即Local->Enclosing function locals->Global->Built-in。这意味着变量的查找顺序是:首先在局部作用域中查找,如果没有找到就到上一级作用域(即包含该函数的函数)中查找,然后到全局作用域中查找,最后到内建作用域中查找。
例如:
x = 10
def func():
x = 5
def inner_func():
print(x) # 输出5
inner_func()
func()
在上面的代码中,inner_func内部使用了变量x,但并没有在函数内部声明变量x,因此会按照LEGB规则先在inner_func的局部作用域中查找,没有找到,然后到包含inner_func的func函数的作用域中查找,找到了变量x的值为5,因此最终输出5。
总结:局部变量和全局变量的区别在于它们的作用域范围不同,局部变量只在函数内部有效,全局变量在整个程序中都有效。在函数内部,变量的查找顺序遵循LEGB规则,使用局部变量会覆盖同名的全局变量。
