变量起作用的范围称为变量的作用域,一个变量在函数外部定义和在函数内部定义,其作用域是不同的。不同作用域内变量名可以相同,互不影响。
局部变量
在函数内部定义的普通变量只在函数内部起作用,称为局部变量。当函数执行结束后,局部变量自动删除,不可以再使用,如下所示。
1 def fun1():
2 x = 1 # 局部变量
3 print('fun1()函数中的x是%d'%x)
4 def fun2():
5 x = 2 # 局部变量
6 print('fun2()函数中的x是%d'%x)
7 fun1()
8 fun2()
9 # print(x)
运行结果如下图所示。

在上例中,第2行与第5行定义的x虽然同名,但属于不同的作用域,两者互不影响,第9行在函数外访问局部变量,程序运行时会报x未定义的错误。
全局变量
如果需要在函数内部给一个定义在函数外的变量赋值,那么这个变量就不能是局部的,其作用域必须为全局的,能够同时作用于函数内外,称为全局变量,此时可以在函数内通过global关键字来声明,如下所示。
1 x = 2 # 全局变量
2 def fun():
3 global x # 使用global关键字声明
4 x += 1
5 print('x = %d'%x)
6 fun()
7 print(x)
运行结果如下图所示。

在上例中,变量x已在函数外定义,在函数fun()内修改外部变量x,则必须在函数内用global声明这个变量,将其声明为全局变量。
此处需注意,如果不使用global声明,则在函数中访问的是局部变量,如下所示。
1 x = 2 # 全局变量
2 def fun():
3 x = 3 # 局部变量
4 print('x = %d'%x)
5 fun()
6 print(x)
运行结果如下图所示。

在上例中,第1行x为全局变量,第3行x为局部变量,只在fun()函数内有效,第4行打印局部变量x的值3,第6行打印全局变量x的值2。
此外,使用内置函数globals()和locals()可以查看局部变量和全局变量,如下所示。
1 x = 1 # 全局变量
2 def fun():
3 x, y = 2, 3 # 局部变量
4 print(x, y)
5 global z # 全局变量
6 z = 1
7 print(locals())
8 fun()
9 print(x)
10 print(globals())
运行结果如下图所示。

在上例中,函数globals()和locals()返回一个字典,通过打印字典中的元素,可以查看全局变量与局部变量。另外,在函数内部可以通过global关键字直接将一个变量声明为全局变量,即使在函数外没有定义,则该函数执行后,这个变量将成为全局变量,如本例中的变量z。
网友评论