Python笔记第八节:函数作用域

函数作用域

函数嵌套:在一个函数中定义了另外一个函数,函数有可见范围,这就是《作用域》的概念,内部函数不能再外部使用,不然会抛出NameError异常,因为外部不能看见内部变量 称为不可见
		#嵌套函数举例:
			def outer():
				def inner():
					print('inner')	#打印inner
				print('outer')		#打印puter
				inner()				#执行了inner函数
			outer()					#调用outer  
			inner()					#这里 会抛出NameError错误  因为inner再内部  外部不可见
作用域:一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域
全局作用域:在整个程序的运行环境中都可见
局部作用域:在函数,类等内部可见,局部变量使用范围不能超过其所在的局部作用域
		局部作用域举例:
			def fn():
				x  = 11 	#这就是局部作用域 在fn内
			def fn1():
				print(x)	#这里的x是上一个函数的x  因为在他在自己的函数里面没有x只能往外找
			print(x)	# 这里打印x是报错的 因为全局没有x变量  它是看不见函数里面x的

从上面代码例子看出:外层变量作用域在内层作用域是可见的,内层定义的变量作用域外层是不可见的

全局变量global:使用global关键字的变量,将声明这个变量是全局的变量(x),函数内部可以直接使用全局变量(x) 如果全局也没有变量(x)就会报错
global总结:内部作用域使用x=5子类的赋值语句会重新定义局部作用域使用的变量x,但是一旦这个作用域中使用了global声明x为全局的,那么x=5相当于在为全局作用域的变量赋值
global使用原则:外部作用域变量会对内部作用域可见,但是不要在内部的局部作用域中直接使用,因为函数的目的就是为了封装,尽量与外界隔离,如果函数需要使用全局变量,请尽量使用函数的形参定义传实参的方式解决。尽量不用global。
		举例:
		x = 5
		def foo():
			global x   #这里声明了x是全局的变量
			x += 1		#这里可以进行修改

函数闭包 :

自由变量:未在本地作用域中定义的变量。例如定义在内层函数外的外层函数的做用域中的变量
	自由变量举例:
	def add():
		c = [0]	 	#这个就是自由变量 不会跟着外层函数消亡而消失 因为还有内存循环在使用
		def foo():
			c[0] += 1		#这里是对外层那个c的元素加1  而不是那个列表
			return c[0]
		return foo
		add()
闭包:上面的代码就是闭包的概念,出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就形成了闭包。很多语言都是这样概念,比如JavaScript

nonlocal关键字:使用了nonlocal关键字将变量标记为不在本地作用域定义,而在上一级的某个局部作用域中定义但不能在全局作用域中定义

	nonlocal举例:
	def counter():
		count = 0
		def inc():
			nonlocal count		#这里就是使用nonlocal标记count不是本地变量 去外面一层找
			return count
		return inc
	foo = counter()
	foo()			#这里第一次执行 返回 1
	foo()			#执行一次会累加    这里第二次执行返回 2
默认值的作用域:使用可变类型作为默认值,就可以修改这个默认值,有的时候这个特性很好用,有的时候这种特性不好,有副作用,如何按照需求改变呢 有两种方法
第一种:使用影子拷贝一个新的对象,永远不能改变传入的参数

默认值

第二种:通过值的判断就可以灵活的悬着或者修改传入对象,这种方法比较灵活,应用比较广泛

默认值2

要改变的方法:

默认

变量名解析原则 LEGB

变量名原则解析

函数的销毁:

1.重新定义同名函数,重新在上级作用域定义同名函数都会销毁函数, 因为引用计算清零
2.del 语句删除函数名称,函数对象引用计算减一
3.程序结束时函数也会销毁
4.上级作用域销毁时 下级的都会销毁 全局作用域的函数的寿命是跟解解释器一样的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值