在这一课中,我们将学习函数的作用域,也就是全局变量和局部变量、作用域以及命名空间的相关概念。让我们开始吧。
在所有编程语言中,每一个类、函数和变量都有一个作用域。简单来说,就是你创建的变量所在的代码块和命名空间是有效的,离开这个代码块后,它们会从内存中被删除。
局部变量 (Local Variable)
我们用一个简单的例子来展示一下:
def function():
a = 5
function()
print(a)
运行这段代码时,我们会看到以下错误信息:
Traceback (most recent call last):
File "/Users/baran/Documents/work/baransel.dev/functions.py", line 7, in <module>
print(a)
NameError: name 'a' is not defined
这个错误的原因是变量 a
在 function()
函数之外是无法找到的,因为 a
变量的作用域仅限于 function()
函数内部。也就是说,变量 a
是一个局部变量。在一个函数中定义的变量只在该函数内有效。
全局变量 (Global Variable)
现在我们了解了什么是局部变量,接下来我们来看一下全局变量是什么。让我给你举个例子:
a = 3
def function():
a = 5
print(a)
function()
print(a)
# 5
# 3
运行这段代码时,我们会看到输出结果是 5
和 3
。下面我们来看看这是怎么回事:
当程序运行时,由于 Python 是解释型语言,它会逐行读取代码,首先执行 function()
函数,结果在函数内部我们得到的 a
的值是 5
。当 function()
执行完后,print()
函数会继续执行,输出的 a
的值是 3
。这里,function()
函数中的 a
是一个局部变量,所以它的作用域仅限于函数内部。print()
函数无法访问这个局部变量,而是访问了全局变量 a
。因此,我们可以将全局变量定义为:
全局变量是那些不属于单一函数的变量,一旦定义了它们,你可以在程序的任何地方调用和使用它们。
现在你可能会问:既然全局变量可以在任何地方使用,那我们能在函数内部调用这些全局变量吗?当然可以,来看一个例子:
a = 3
def function():
print(a)
function()
# 3
Global 表达式 (Global Expression)
既然我们已经了解了这些概念,我还要告诉你一个小知识点,以免你混淆。在前面我们提到全局变量时,是指那些不属于某个函数的变量。可是,我们也可以在函数内部使用全局变量。那么,能不能在函数内部创建全局变量呢?让我们来试试:
def function():
global a
a = 3
print(a)
function()
print(a)
# 3
# 3
从上面的代码中,我们得到了两个 3
。来看看是怎么回事的:
首先,function()
函数会执行,并打印出 a
的值。然后 print()
函数会运行,由于我们在函数内使用了 global
关键字声明了 a
是一个全局变量,所以 print()
函数也能访问这个全局变量,输出的值还是 3
。
通过这个例子,我们学习了如何在函数内部使用 global 表达式来创建全局变量。不过有一点需要提醒你,虽然全局变量可以在程序的任何地方访问,但滥用它们可能会让代码变得复杂。所以,建议还是尽量在函数内部使用局部变量,这样代码会更清晰、更易于维护。