第5.4节 Python函数中的变量及作用域

一、函数中的变量使用规则

  1. 函数执行时,使用的全局空间是调用方的全局空间,参数及函数使用的局部变量存储在函数单独的局部名字空间内;
  2. 函数的形参在函数中修改了值时,并不影响调用方本身的数据,但如果形参是一个可变类型的容器,在函数中修改了容器中的元素,则该修改会影响到调用方的数据;
  3. 函数中的变量,既可以使用局部变量(本地名字空间的变量),也可以使用全局变量(全局名字空间的变量),函数在执行查找变量只读时,先在局部变量中查找,找不到再查到全局变量中查找。因此当局部变量和全局变量中有相同名字的变量时,函数使用的就是局部变量,只有当局部变量没有对应变量才会使用全局变量。一般情况下,函数只应该操作局部变量,不操作全局变量,只有特殊情况下才访问全局变量;
  4. 在函数内部给变量赋值且该赋值表达式中包含该变量(如x=x+1)时,该变量默认为局部变量,除非你明确地告诉Python它是全局变量或非局部变量,如果函数中没有定义要使用的变量为局部变量,又没有进行全局变量或非局部变量的声明,则Python会认为函数没有对应变量的定义和赋值,所以报错。

二、函数中对全局变量赋值的方法

1、使用global声明变量为全局变量,就是在使用前,使用语法:

global 全局变量名

然后象使用局部变量一样该变量。

2、对全局空间的字典键-值访问方式直接操作全局变量,使用前先通过globals()函数获取全局名字空间,再通过字典的键-值方式访问。举例:

#函数定义
def f(x):
	g,l=globals(),locals() #取函数的全局空间和局部空间
	g['x']=x*100  #修改全局空间变量x的值为局部变量x的值*100
	     return g,l
	   #调用方代码
	    x=1  #调用方x赋值
	    g1,l1=f(x)  #返回函数的全局空间g1和局部空间l1,执行后x变成了100
	    g,l=globals(),locals()  #取调用方的全局空间g和局部空间l
实际上g、g1、l是同一个对象,用is判断返回为True,但l1则不同。

3、将该全局变量存放到一个类似如列表的容器中,然后将该容器作为形参传递给函数,在函数中对容器的元素直接赋值。

三、nonlocal变量

      函数中的变量除局部变量和全局变量外,还有一种变量为非本地变量,使用nonlocal来进行声明,但nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误。在此只是简单引出,使用也比较简单,不进行详细介绍。

 

    老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

你可能感兴趣的:(老猿Python)