python之golbal/nonlocal

一、关键字

golbal nonlocal

在局部修改全局的变量为什么会报错

count = 0

def func():
    count += 1
func()
# UnboundLocalError: local variable 'count' referenced before assignment
# 解释器认为:如果你在局部作用域对一个变量进行修改了,你在局部作用域已经定义好这个变量了。

解释器认为: 如果你在局部作用域对一个变量进行修改,name你在局部作用域已经定义好这个变量了。

1. global (***)

用途

  • 可以在局部作用域申明一个全局变量

例题

def func():
	global name # 用法
	name = 'alex'
	print(locals())
func()

# 总结
# 申明一个变量的方法:global name
  • 可以在局部修改一个全局变量

例题

count = 0

def func():
    global count
    count += 1

print(count)
func()
print(count)

# 输出结果
0
1

总结:
# 程序从上往下执行,先定义一个局部变量count = 0,然后往下执行,到print(count),这时候count指向的还是0,到func()也就是变量名加括号,开始执行定义函数,进入函数内部,声明count为全局变量,然后对count进行修改+1,跳出函数执行print(count),这个时候count已经+1操作,结果是1

2. nonlocal (了解)

用途

  • nonlocal不能操作全局变量
  • nonlocal 可以对父级作用域的变量进行修改,并且在当前作用域创建

例题

def func():
    count = 0
    def inner():
        nonlocal count
        count += 1
        print(count)
        print(locals())
    inner()
    print(locals())
func()


# UnboundLocalError: local variable 'count' referenced before assignment

# 在没有申明一个nolocal的情况下,定义函数在子局部对父局部的变量进行修改也会报错,原因如下:
# 解释器认为:如果你在局部作用域对一个变量进行修改了,
# 你在局部作用域已经定义好这个变量了。

一句话总结

全局有count = 0 这个变量,或者在函数内部申明一个global count,此时在局部才可以对全局变量进行修改

# 正确的操作方法
count = 0
def func():
	global count
	count += 1
	return count
print(func())
posted @ 2019-06-19 20:44  爱咋闹  阅读(1046)  评论(0编辑  收藏  举报