Python中函数的作用域和变量可见性是怎么样的?
Python中函数的作用域和变量可见性是很重要的知识点,对于刚开始学习Python的人来说是必须掌握的。Python的作用域和变量可见性分为全局变量和局部变量,全局变量指在函数外定义的变量,而局部变量则是在函数内部定义的变量,下面我们就来详细看一下Python中函数的作用域和变量可见性。
1、Python函数作用域及命名空间
Python定义了四种不同的作用域,分别是:
1.1 L(Local):局部作用域
1.2 E(Enclosing):闭包函数外的函数中
1.3 G(Global):全局作用域
1.4 B(Built-in):内建作用域
下面我们详细来看一下这四种作用域的含义。
1.1 局部作用域(L)
局部作用域是Python中最小的作用域,它只在本函数内起作用,在函数体内定义的变量只有在函数内部可见,外部无法访问。如果在函数体内和函数外部使用相同变量名,则在函数体内的变量是该变量名的一个新实例。
1.2 闭包函数外的函数中(E)
闭包函数外的函数中表示的是指在函数内部定义一个函数,并且这个内部函数使用外围函数的变量时,这个外围函数就成为了闭包函数。在闭包函数中,内部函数可以访问外部函数中的变量,但不能修改外部函数中的变量。
1.3 全局作用域(G)
在Python程序中定义的变量,一般都是全局的,如果找不到一个变量的定义,Python会默认在全局作用域中查找这个变量。全局作用域里的变量可以在当前模块的任意位置被访问和修改。
1.4 内建作用域(B)
内建作用域是Python内置的一些变量,例如常用的float、int、print等。这些变量在任何模块中都可以访问。
Python的作用域决定了变量在哪个作用域中可用,以及何时可以访问它们。
2、Python变量可见性
在Python中,变量作用域的可见性受到一些规则的保护。如果在函数内部定义了一个变量,则该变量会默认作为局部变量,如果引用并修改全局变量,则需要使用global声明。下面我们看一下Python中变量可见性的几个例子:
2.1 局部变量
在函数体内部定义的变量只有在函数内部可见,外部无法访问。如果在函数体内和函数外部使用相同的变量名,则在函数体内的变量是该变量名的一个新实例。
def test():
x = 10
print(x)
test() # 10
print(x) # NameError: name 'x' is not defined
这里定义了一个函数test(),函数内部定义了一个变量x,当在函数内部调用x时,输出的值为10,如果在函数外调用x,则会出现NameError的错误提示。
2.2 全局变量
当在函数内部访问外部定义的全局变量时,默认情况下,Python会认为该变量是在局部作用域之外定义的全局变量,因此Python会优先使用函数内的局部变量。
x = 10
def test():
print(x)
test() # 10
在这个例子中,定义了一个全局变量x,在函数内部调用了该变量,输出的结果为10。
2.3 修改全局变量
当我们在函数内部修改全局变量时,我们需要使用global关键字来声明变量为全局变量。
x = 10
def test():
global x
x += 5
print(x)
test() # 15
print(x) # 15
在这个例子中,我们在函数内部修改了全局变量x的值,并使用global关键字声明x是一个全局变量。当在函数内部使用x时,输出的值为15。
