一、局部变量的概念
在函数内部定义的变量称为局部变量,只能在函数内部使用。局部变量的生命周期和函数相同,函数执行结束后,变量也就销毁了。
def test():
var = "局部变量"
print(var)
test()
执行结果为:
局部变量
在函数内部,我们定义了一个名为var的变量,并将其值设定为"局部变量",随后我们又在函数内将变量输出。输出结果说明了我们的局部变量是起效的。
二、局部变量的作用域
作用域决定了局部变量的访问权限。Python中的作用域分为四种:
- Local:局部变量的作用域为函数内部,在函数外部无法访问这些变量
- Enclosing:在嵌套函数中引用变量,如下面的例子
- Global:全局变量的作用域为整个Python模块,在模块内引用变量时都能访问该变量
- Built-in: Python内置变量的作用域是Python内置模块中的所有函数
Enclosing作用域的例子
def outer():
x = "outer function"
def inner():
y = "inner function"
print(x)
print(y)
inner()
outer()
输出结果为:
outer function
inner function
分析一下这个例子,我们定义了一个名为outer的函数,并在函数内定义了一个x变量。然后在函数内部,我们再定义了一个inner函数,并在其中定义了一个y变量,随后我们输出了x和y。由输出结果可知,在inner函数内部,它可以访问到outer函数内部定义的x变量,因为outer就是inner的Enclosing作用域。
三、函数中变量的生命周期
函数是Python中常见的代码块结构,变量的生命周期和函数密切相关,一旦函数退出,其内部所定义局部变量也随之消失,这就决定了在函数中定义的变量与外部变量的访问权限。
def test():
var = "函数内的局部变量"
print(var)
test()
print(var) # 错误代码
这个例子中,我们定义了test函数,并在函数内部定义了一个var局部变量,执行函数后会输出它的值。但是在函数外部,我们不能再访问这个变量了,因为它的作用域只在函数内部。因此在函数外尝试输出var值,Python解释器会报错。
四、全局变量和局部变量的区别
全局变量和局部变量有一个根本的区别,局部变量在函数执行结束后就会销毁。因此,在Python中为了避免变量污染,我们常常使用局部变量去代替全局变量。全局变量在程序的各个部分中都能使用,通常声明在函数的外部或者在模块顶层。
使用局部变量:
n = 10 # 全局变量
def add(m):
global n
n += m # 修改全局变量n
print(n)
add(5)
这个例子中,我们定义了一个全局变量n,并在add函数中修改了n的值,由于n是全局变量,所以在函数执行结束后,n的值并没有被销毁,而是继续存在。
使用全局变量和局部变量:
n = 10 # 全局变量
def add(m):
n = 1 # 局部变量,与全局变量n不一样
n += m # 修改局部变量n
print(n)
add(5)
print(n)
执行结果为:
6
10
从代码和执行结果可知,我们在add函数中定义了一个名为n的局部变量,并给它赋值为1,而不是使用全局变量n。在函数执行结束后,全局变量n的值并没有改变。
五、函数参数的传递方式
Python中函数参数有两种传递方式:值传递和引用传递。
值传递:
def func(a):
a = 10
print(a)
b = 20
func(b)
print(b)
执行结果为:
10
20
可以看到,尽管函数内部修改了a的值,但是在函数外部b的值并没有改变,所以b是值传递。
引用传递:
def func(lst):
lst[0] = 100
print(lst)
lst = [1, 2, 3]
func(lst)
print(lst)
执行结果为:
[100, 2, 3]
[100, 2, 3]
我们在函数内部修改了lst的值,在函数外部输出lst值时,它已经被修改了。因此,lst是引用传递。
六、小结
本文主要从局部变量的概念和作用域、函数中变量的生命周期、全局变量和局部变量的区别、函数参数的传递方式等多个方面来详细阐述了Python中局部变量的定义与使用。局部变量作为函数内部的变量,其作用域只在函数内部有效,因此使用它能避免变量污染。在使用过程中,应该注意全局变量和局部变量的区别,以及函数参数的传递方式。