python里面的局部变量和闭包

局部变量

局部变量指的是一个变量只能在其作用域内起到作用,当区域内的代码执行完毕后,这个变量就会销毁。
例如:

a = 10
def local():
	a = 11
	print(a)
local()
print(a)

这段代码会一次输出11,10
其中a = 10是全局变量,而函数内的a = 11为局部变量。a = 11的作用域仅限于loca()函数。

可是当我们调换一下a = 11和print语句的位置时,就会出现a未定义的错误。
例:

a = 10
def local():
	print(a)
	a = 11
local()
print(a)

这是会出现错误,因为在运行函数时定义了一个变量a,这使得在local()函数内变量名a代表的是一个局部变量。在变量未声明前使用变量就会导致错误。

但当我们吧全局变量a换成可变的数据类型时就不会出现错误。

a = [1,2,3]
def local():
	print(a)
	a.append(4)
local()
print(a)

结果是输出:[1,2,3], [1,2,3,4]
不会出现错误的原因就是a是一个列表,列表时可变的数据类型,在local()函数里对其进行修改时并不会创建新的变量。

闭包

闭包指的是延申一个变量的作用域。
例如:

def out():
	a = []
	def inner():
		a.append(10)
		print(a)
	return inner
i = out()
i()

结果会输出[10]。a=[]产生了作用域的延伸,也就是闭包。
但把a换成不可变的数据时,就会报错。

def out():
	a = 1
	def inner():
		a = a + 1
		print(a)
	return inner
i = out()
i()

在inner()里重新定义了a使得a变成了inner()的局部变量,在没有定义变量前使用变量就会导致错误。改进方式为在inner()里nonlocal来声明自由变量(out()里的a在inner()里别成为自由变量)。

def out():
	a = 1
	def inner():
		nonlocal a
		a = a + 1
		print(a)
	return inner
i = out()
i()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值