python的作用域,内嵌函数和闭包

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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值