局部变量

要谈局部变量和全局变量的技术前提是对函数有一定的理解,我们先在这里简单说明一下Python的函数,Python有自带的函数也可以使用第三方工具包了外部引用函数,有的时候用户自己可以自主开发一些特定功能的函数我们称之为自定义函数。用户怎么才能自己定义函数呢?Python 规定的自定义函数语法结构如下:

def function_name(parameters):
(TAB)statement1
(TAB)statement2
(TAB)statement3
(TAB)etc.

第1行是定义函数名及函数的参数,请注意函数右括号后有一个冒号!第2-5 行是函数语句块。需要注意的是函数名下的每条语句前都要用TAB键缩进一下,否则会认为是非本函数的语句块里的语句,而是与函数同级的程序的某条语句。Python函数体不用花括号将语句块括起来而是用TAB来区分语句是函数里的还是不是函数的。函数无返回值类型,行参也无数据类型说明。

自定义函数可以像C语言一样在其他地方被其他程序或语句调用,调用自定函数时不需要使用def这个关键字。我们举例说明一下。

#define function: add
def add(x, y):
    z = x + y    
    return z
#define main function
def main():
    a = 12
    b = 13
#function 'add' called
c = add(a, b)   
print c
#programme entry
main()
print 'End!'

程序代码从第13行开始执行,从第2行到第11行分别定义了add和main两个函数。add函数有两个形参x 和y,而main 函数无形参也无返回值。程序从第13行开始执行然后跳转到自定义main函数的的第7 行、8行和第10行,当程序执行到第10行的时候又跳转到add函数的第3 行、第4行将和返回给调用函数main,当add 执行完以后返回到调用函数main函数,同时会把返回值赋值给第10行的等号左边的c 这个变量,接下来执行第11行,打印求和结果,执行完11 行后main被全部执行完毕返回到第13行的下一行第14 行打印出字符串’End!’,至此整个程序结束。

有了函数的基本概念以后,我们再来聊聊Python变量的局部变量问题。顾名思义局部变量肯定生活在某个局部地方,那什么叫局部变量呢?定义在函数体内的变量叫局部变量,因此我们可以很快得到全局变量的定义,那就是定义在函数体外的变量时全局变量。局部变量只可被本函数使用,全局变量可以被所有语句访问使用。

def f1():
    x = 12
    print x
def f2():
    y = 13
    print y
def f3():
    print x
    print y
def main():
    f1()
    f2()
    %f3()
main()print 'End!'

此时第13行代码是被注释掉的,如果打开第13行会报错如下:

>>>1213Traceback (most recent call last):
  File "F:/Python27/t2.py", line 14, in <module>
    main()
  File "F:/Python27/t2.py", line 13, in main
    f3()
  File "F:/Python27/t2.py", line 8, in f3    print xNameError: global name 'x' is not defined
>>>

错误是说main函数在调用函数f3时发现f3函数某一行有问题(的第8行)“print x” 里的x 没有定义。我猜设计者是想打印f1定义的x 想打印出12,对么?但x定义在自定义函数f1 里,x此时是局部变量不能被除f1 函数之外的函数或者语句使用,故报错。由于局部变量定义在函数体里,故多个函数可以在各自函数体内使用相同的变量名作为自己的变量。

全局变量

全局变量没有定义在任何函数体内,或者可以这么说和main函数属于同一级,全局变量可以被自定义的函数访问使用,如果函数想读去某个全局变量没有特别的要求,直接使用即可。但是如果某函数想在函数里修改某个全局变量,Python语言要求在修改前用global 语句声明一下这个变量是全局的才能修改这个全局变量。

def printLocalx():
    x = 12
    print 'f1 local x = ',    
    print x
def printLocaly():
    y = 13
    print 'f2 local y = ',   
    print y
def readGlobal():    
    print 'f3 read global x = ',    
    print x    
    print 'f3 read global y = ',    
    print y
def modifyGlobal():
    global x    
    print 'f4 write x = -1'
    x = -1
def main():
    printLocalx()
    printLocaly()
    readGlobal()
    modifyGlobal()
x = 200
y = 100
main()
print 'after modified global x = ',
print x
print 'End!'

此时由于程序定义了全局变量x和y,故readGlobal函数的两条打印语句是不会报语法错误的。全局变量可被任何子函数访问使用,在readGlobal函数里(第11行和第13行)读x和y变量的值,没有问题。而在modifyGlobal函数体里(第17行)将x赋值为-1,如果自定义函数体修改全局变量,首先要像第15行那样声明一下这个x是全局的变量,只有这样才能修改全局的x变量。如果去掉第15和16行,第17 行的x将被看做modifyGlobal 函数的局部变量。

程序执行结果如下所示:

f1 local x =  12f
2 local y =  13
f3 read global x =  200
f3 read global y =  200
f4 write x = -1after 
f4 modified global x =  -1
End!


转载于:https://blog.51cto.com/jeapedu/1617073