python之旅基础——全局变量和局部变量
一、举例
全局变量:定义在函数之外,作用域为整个代码。
局部变量:定义在某个函数之内,作用域为该函数之中。在作用域外无法调用局部变量。
首先明确以下三点:
1、程序是从上向下执行的。
2、在执行函数过程中,如果本函数内部没有找到要执行的变量,将会在上一层函数中找,如果依然没有,将会在全局中找。
3、函数在创建过程中不会被调用执行,只用在函数名+()时,才会被调用。
x = 10
def fun1():
x = 5
print(x)
def fun2():
print(x)
fun1()
fun2()
print(x)
5 #调用fun1()过程中,函数内部就有x变量,所以获取后就被打印。
10 #调用fun2()过程中,函数内部没有x变量,所以在上一层找到全局变量x,获取后打印。
10 #执行print(x)代码时,获取全局变量x。这里同样说明的是,fun1()中的x的作用域只在函数fun1中,所以不会在全局中调用。
二、global关键字
在函数内部,只能调用全局变量。但如果想更改全局变量,可以使用global关键字。
x = 10
def fun1():
global x
x = 5
print(x)
def fun2():
print(x)
print(x) #此时,打印全局变量x。
fun1() #调用fun1()函数,将全局变量x修改为5,并打印变量x(这个变量在函数内部,但是由于使用global关键字定义了x,那么x就是全局变量)。
fun2() #由于先调用了fun1(),此时全局变量已经被修改,所以打印出改变后的全局变量。
print(x) #此时,同样打印全局变量,但是由于fun1()执行在前,所以打印出改变后的全局变量。
10
5
5
5
在下面的代码中,函数fun1()先定义了局部变量x,又将使用global关键字修改全局变量x。所有在fun1()中出现了同名的全局变量和局部变量,最终结果会报错。
x = 10
def fun1():
x = 7
global x
x = 5
print(x)
fun1()
E:\python视频\oldboy_python\venv\Scripts\python.exe E:/python视频/oldboy_python/全局变量和局部变量/全局变量和局部变量.py
File "E:/python视频/oldboy_python/全局变量和局部变量/全局变量和局部变量.py", line 111
global x
^
SyntaxError: name 'x' is assigned to before global declaration
三、嵌套函数
在函数中创建函数,就实现了函数的嵌套。强调的是,函数只有被调用才会被执行,所以要注意写入调用语句。
x = 10
def fun1():
x = 5
print(x)
def fun2():
global x
x = 7
print(x)
fun2() #定义fun2()后,记得调用,否则fun2()将不会被执行
print(x)
fun1()
10
5
7
!!!从下面的代码中可以看出,嵌套层的函数只能调用上一层或者全局变量,不会对上一层的变量进行修改。上一层的函数不会调用嵌套层的变量。当fun1()最后print(name)时,依然获取的是本函数内的局部变量。
name = "x"
def fun1():
name = "y"
def fun2():
global name
name = "z"
fun2()
print(name)
print(name) #这里获取到全局变量name,“x”
fun1() #调用fun1()函数。首先,获取到局部变量name,“y”;然后,调用嵌套函数fun2(),fun2()函数将全局变量name的值改为“z”;最后打印fun1()中的局部变量。
print(name) #打印被修改过的全局变量name,“z”
x
y
z
四、nonlocal关键字
根据上一个例子,可以看出嵌套层的函数只能调用上一层或者全局变量,不会对上一层的变量进行修改。但是可以通过nonloacl关键字,实现嵌套层对上一层的变量进行修改。
name = "x"
def fun1():
name = "y"
def fun2():
nonlocal name
name = "z"
fun2()
print(name)
print(name) #调用全局变量name,“x”打印
fun1() #调用fun1()函数。首先,获取到局部变量name,“y”;然后,调用嵌套函数fun2(),fun2()函数将上一层fun1()中的name的值改为“z”;最后打印fun1()中的局部变量(此时name已经被修改成为“z”)。
print(name) #全局变量没有发生改变。
x
z
x
注:nonlocal关键字只用于嵌套函数中,如果只是一层函数,使用nonlocal关键字时,会报错。
name = "x"
def fun1():
nonlocal name
name = "y"
print(name)
print(name)
fun1()
print(name)
File "E:/python视频/oldboy_python/全局变量和局部变量/全局变量和局部变量.py", line 92
nonlocal name
^
SyntaxError: no binding for nonlocal 'name' found
五、补充
函数的作用域遵循LEGB规则。
L:local 内部局部变量
E:enclosing 嵌套局部变量,相对于local来说,就是外部局部变量
G:global 全局变量
B:built_in 内置函数创建的变量
函数中的变量按照LEGB的规则进行查找
分析下面代码的出错原因:
count = 10
def func():
print(count)
count = count + 1
func()
#报错信息:
#UnboundLocalError: local variable 'count' referenced before assignment
在运行以上程序的时候,计算机首先将所有代码加载到内存,包括定义的func()函数。当最后遇到func()代码时,调用函数,执行函数内的代码。
当运行到print(count)时,程序报错“局部变量"count"不能在定义前被引用”。也就是说,程序已经检测到func内部用count变量(这个变量和全局变量count=10不是同一个),程序简单的成为需要把count = count + 1先执行。

浙公网安备 33010602011771号