python 变量作用域
1、在函数内部定义的变量称为“局部变量”,只作用于函数内部,函数外无法调用。
2、在函数外定义的变量称为“全局变量”,作用于全局。
3、在局部想要更改全局变量,需要使用global
4、在内层函数想要更改外层函数变量,需要使用nonlocal
一、global用法
例如
name = “YY” # 全局变量
def f1():
global name # 声明name为全局变量
name = "JJ" # 直接修改全局变量
print(name)
f1() # JJ
print(name) # JJ
nonlocal用法
例如
def f1():
age = 18
def f2():
nonlocal age
age = 20 # 调用f2后将直接修改外层变量age
print(age) # 打印内层变量 20
f2() # 调用f2函数
print(age) # 打印外层变量 20
f1()
在全局中定义变量名和局部变量相同时优先取局部变量的值,在局部变量中a若没有被定义则会报错
a=6688
def foo():
a=666 #在此处将a注释的话,由于在foo函数的局部变量a中,下面定义了a=888,则不会取全局变量的a=6688,会报(UnboundLocalError: local variable 'a' referenced before assignment,分配前引用的局部变量“a”)的错误。
print("foo(), 修改前a:\t", a)
a=888
print("foo(), 修改后a:\t", a)
def bar():
a = 6666
print("bar(), a:\t", a)
foo()
bar()
输出
foo(), 修改前a: 666
foo(), 修改后a: 888
bar(), a: 6666
内嵌函数和闭包;
python中的函数定义是可以嵌套的,就是可以在函数内部再建一个函数;内部的函数就为:内嵌函数或内部函数;
内嵌函数
def fun()
num = 1
def foo()
num = 2 #内部函数的局部变量
print(num)
print(num)
foo()
print(num)
fun()
#结果为 1 2 1
#foo()即为内嵌函数
闭包
闭包:内部函数使用外部函数的局部变量,那么我们就称内部函数为闭包
简单的理解就是:闭包就是调用一个函数,它返回了另一个函数给你 那么
加粗样式返回的这个函数就叫做闭包
如:
例1:
def outer(num): #===> num = 5
def inner(val): #===> val = 5
return num + val
return inner
res = outer(5) #outer(5) ===> inner res = inner(此处为外部函数的返回值,为内部函数的函数名)
result = res(5) #res(5) == inner(5) (此处调用内部函数)
print(result) #===>10
例2:
闭包引用外部函数的局部变量的前提是:内部没有这个变量
错误实例:
def outer(a):
def inner()
a=a+1
return a
return inner
res = outer(1)
print(res)
此时内部变量和外部变量一样,函数运行的时候系统首先识别到a在进入内部变量之前就被用了,在内部函数再次调用,相当于给a重新赋值;所以会报错;
正确实例:
def outer(a):
def inner()
b=a+1
return b
return inner
res = outer(1)
print(res)