#简单来说,作用域就是一个变量的命名空间。在Python中,程序的变量并不是在任何位置都可以访问的,访问权限决定于这个变量是在哪里赋值的,代码中变量被赋值的位置决定哪些范围的对象可以访问这个变量,这个范围就是命名空间。
#变量的作用域决定哪一步部分程序可以访问特定的变量名称。Python中有两种最基本的变量作用域:局部变量和全局变量。
1、局部变量
1 #在函数内定义的变量名只能被函数内部引用,不能在函数外引用,这个变量的作用域是局部的,也成为局部变量。 2 #定义的变量如果是在函数中第一次出现,就是局部变量,例如: 3 # /usr/bin/python3 4 #!-*-conding:UTF8 -*- 5 #变量作用域_局部变量 6 7 def func(): 8 x=100 9 print ('x') 10 func() 11 #在func函数中,x是在函数体中被定义的,并且是第一次出现,所以x是局部变量。局部变量只能在函数体中被访问,超出函数体的范围访问就会报错,例如: 12 # /usr/bin/python3 13 #!-*-conding:UTF8 -*- 14 #变量作用域_局部变量 15 16 def func(): 17 x=100 18 print ('变量x:%s'%x) 19 print('函数体外访问变量x:%s'%x) 20 func() 21 #执行结果如下: 22 ================= RESTART: C:/Users/L/Desktop/变量作用域_局部变量.py ================= 23 Traceback (most recent call last): 24 File "C:/Users/L/Desktop/变量作用域_局部变量.py", line 8, in <module> 25 print('函数体外访问变量x:%s'%x) 26 NameError: name 'x' is not defined 27 #执行结果告诉我们,第8行的x没有定义,由输入代码可见,第8行语句没有在函数体中,所有执行时报错了。如果把x作为实参传入函数体中,在函数体中不定义变量x,会将x认为是怎样的变量呢?定义如下函数并执行: 28 # /usr/bin/python3 29 #!-*-conding:UTF8 -*- 30 #变量作用域_局部变量 31 32 def func(x): 33 print('局部变量x为',x) 34 func(10) 35 #执行结果如下: 36 ================= RESTART: C:/Users/L/Desktop/变量作用域_局部变量.py ================= 37 局部变量x为 10 38 #由执行结果看到,输出了局部变量的值。这里就有一个问题了,在函数体中没有定义局部变量,x只是作为一个实参传入传入函数体中,怎么就变成了局部变量了,这是因为参数的工作原理类似于局部变量,一旦进入函数体,就称为了局部变量了。 39 #如果在函数外定义了变量x并赋值,在函数体中能否使用x?定义如下函数并执行: 40 # /usr/bin/python3 41 #!-*-conding:UTF8 -*- 42 #变量作用域_局部变量 43 44 x=30 45 def func(): 46 print('x:',x) 47 func() 48 #执行结果如下: 49 ================== RESTART: C:/Users/DL He/Desktop/局部变量.py ================== 50 x: 30 51 #由执行结果看到,在函数体中可以直接使用函数体外的变量(全局变量,在下面会讲到)。 52 #如果在函数外定义了变量x并赋值,将x作为函数的实参,在函数体中更改x的值,函数体外的值是否跟着变更呢?定义如下函数并执行: 53 # /usr/bin/python3 54 #!-*-conding:UTF-8 -*- 55 #变量作用域_局部变量 56 57 x=30 58 def func(x): 59 print('x:',x) 60 x=2 61 print('局部变量x:',x) 62 func(x) 63 print('函数体外的x:',x) 64 #执行结果如下: 65 ================== RESTART: C:/Users/DL He/Desktop/局部变量.py ================== 66 x: 30 67 局部变量x: 2 68 函数体外的x: 30 69 #由输出结果看到,在函数体中更改变量的值并不会更改函数体外变量的值。这是因为调用func函数时创建了新的命名空间,他作用于func函数的代码块。赋值语句x=2只在函数体的作用域内起作用,不能影响外部作用域中的x。可以看到,函数外部调用x时,他的值并没有改变。
2、全局变量
1 #在函数外,一段代码最开始赋值的变量可以被多个函数引用,这就是全局变量。全局变量可以在整个程序范围内访问。示例如下: 2 # /usr/bin/python3 3 #!-*-conding:UTF-8 -*- 4 #变量作用域_全局变量 5 6 total=0 7 def sum(arg1,arg2): 8 total=arg1+arg2 9 print('函数体内局部变量:',total) 10 return total 11 #sum(10,20) 12 13 def totalprint(): 14 print('total的值是:',total) 15 return total 16 print('函数求和结果为:',sum(10,20)) 17 totalprint() 18 print('函数外的全局变量:',total) 19 #执行结果如下: 20 =============== RESTART: C:/Users/DL He/Desktop/变量作用域_全局变量.py =============== 21 函数体内局部变量: 30 22 函数求和结果为: 30 23 total的值是: 0 24 函数外的全局变量: 0 25 #由执行结果看到,全局变量可在全局使用,在函数体中更改全局变量的值不会影响全局变量在其他函数或语句中的使用, 26 #再来看一个函数定义并执行的示例: 27 # /usr/bin/python3 28 #!-*-conding:UTF-8 -*- 29 #变量作用域_全局变量 30 31 num=100 32 def func(): 33 num=200 34 print('函数体内的num:',num) 35 func() 36 print('函数体外的num:',num) 37 #函数执行结果如下: 38 =============== RESTART: C:/Users/DL He/Desktop/变量作用域_全局变量.py =============== 39 函数体内的num: 200 40 函数体外的num: 100 41 #由输出结果看到,我们定义了一个名为num的全局变量,在函数体中也定义了一个名为num的局部变量,在函数体中使用的是函数体中的num变量,在函数体外使用num变量时使用的是全局变量的值。 42 #由此我们得知:函数中使用某个变量时,入股该变量名既有全局变量又有局部变量,就默认使用局部变量。 43 #要将全局变量变为局部变量,只需在函数体中定义一个和局部变量名称一样的变量即可。能否将函数体中的局部变量变成全局变量呢?定义如下函数并执行: 44 # /usr/bin/python3 45 #!-*-conding:UTF-8 -*- 46 #变量作用域_全局变量 47 48 num=100 49 print('函数调用前的num:',num) 50 def func(): 51 global num 52 num=200 53 print('函数体中的num:',num) 54 func() 55 print('函数调用后的num:',num) 56 #执行结果如下: 57 =============== RESTART: C:/Users/DL He/Desktop/变量作用域_全局变量.py =============== 58 函数调用前的num: 100 59 函数体中的num: 200 60 函数调用后的num: 200 61 #由函数定义及执行结果看到,在函数体中的变量num前加了一个global关键字后,函数调用结束后,在函数外使用num时,值变为和函数体中一样了。 62 #由此我们得知,要在函数中将某个变量定义位全局变量,在需要被定义的变量前加一个关键字global即可。 63 #在函数体中定义global变量后,在函数体中对变量做的其他操作也是全局性的。定义如下函数并执行: 64 # /usr/bin/python3 65 #!-*-conding:UTF-8 -*- 66 #变量作用域_全局变量 67 68 num=100 69 print('函数调用前num:',num) 70 def func(): 71 global num 72 num=200 73 num+=100 74 print('函数体中的num:',num) 75 func() 76 print('函数调用结束后的num:',num) 77 #执行结果如下: 78 =============== RESTART: C:/Users/DL He/Desktop/变量作用域_全局变量.py =============== 79 函数调用前num: 100 80 函数体中的num: 300 81 函数调用结束后的num: 300 82 #由执行结果看到,在函数体中对定义的全局变量num做了一次加100的操作,num的值由原来的200变成300,在函数体外获得的num的值也变成了300.