全局变量与局部变量

全局变量与局部变量

全局变量与局部变量两者的本质区别就是在于作用域

用通俗的话来理解的话,

全局变量是在整个py文件中声明,全局范围内都可以访问

局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了

如果在函数内部定义与某个全局变量一样名称的局部变量,就可能会导致意外的效果,可能不是你期望的。因此不建议这样使用,这样会使得程序很不健全 

作用域

name = '张望';
def func():
    name1= '诗仙'
    print('全局变量为:',name,'\n局部变量为:',name1)

func()
# 执行结果
全局变量为: 张望 
局部变量为: 诗仙

print("函数外直接打印全局变量:",name)# 函数外直接打印全局变量: 张望
print('函数外直接打印局部变量':name1) # 报错了,局部变量作用域仅在函数内部

 

就近原则

name = '张望';
def func():
    name= '诗仙'
    print('全局变量为:',name)

func()

#执行结果:
全局变量为: 诗仙  

#当局部变量与全局变量一样时,取用就近原则,优先获取函数内部距离最近的变量,,如果没有再向外获取

name = '张望';def func(): #name= '诗仙' print('全局变量为:',name) func()#执行结果:   全局变量为: 张望 #函数内部没有,向外获取

global关键字 

 

name = '张望';
def func():
    global name
    name = '诗仙'
    print('全局变量为:',name)

func()
print('函数外打印全局变量:',name)

# 执行结果:
全局变量为: 诗仙
函数外打印全局变量: 诗仙  

# 使用global关键字就是告诉python编译器这个变量不是局部变量而是全局变量,其实有点像是"引用"的意思,可以简单理解为,此时 global name 就是全局变量 name

 

nonlocal关键字

 字面意思就是指当前的这个变量不是局部变量。nonlocal是Python3.0中新增的关键字,python2.x不支持

def func():
    age =2
    def func2():
        age*=2
        print('全局变量为:',age)
    return func2()
func()

#执行结果:
报错:UnboundLocalError: local variable 'age' referenced before assignment

 

age = 3
def func():
    age =2
    def func2():
        nonlocal age   # nonlocal,指定上一级变量,如果没有就继续往上直到找到为止
age*=2 print('全局变量为:',age) return func2() func() 

#执行结果: 全局变量为: 4

 

global 与 nonlocal

  global可以在任何地方修饰变量,而且被global修饰的变量直接被标识为全局变量,对该变量修改会影响全局变量的值,但不影响函数中未被global修饰的同名变量(依然是局部变量),

  nonlocal只能在嵌套函数(可能还有其他的地方,我还没有检查)中使用,用于标识嵌套函数中的变量是包含该嵌套函数的函数中的同名变量,在嵌套函数中修改变量会影响函数中的变量。

  如果在函数中使用global修饰了变量,那么在嵌套函数中用nonlocal修饰同名变量会发生报错,因为nonlocal表示该变量在函数中已经定义,但检查时因为同名变量被global修饰为全局变量,所以不存在同名的局部变量,从而导致错误。


 

---恢复内容结束---

posted @ 2019-07-16 10:53  黑羽小白  阅读(304)  评论(0)    收藏  举报