python中变量不需要事先声明_python 变量搜寻顺序法则LEGB之E注意事项

众所周知,在python中,变量不需要事先声明,赋值后,即可调用使用。而调用的法则遵从LEGB法则,其中L为local,E为enclosing,G为Global,B为built-in,即变量首先在局部搜索,比如一个函数中,如果没有搜寻到,则继续在enclosing中搜寻,比如嵌套函数中更靠外侧的函数,如果还是没有,则搜索全局变量,如果还是没有,就搜索内建变量名,最终找不到的话,则抛出异常。当然,值得一提的是,如果定义了nonlocal,那么将不遵从LEGB法则。

今天要总结的重点是,虽然class 也提供local scope,但是它与函数进行嵌套时,不会产生enclosing的范围,即它嵌套的函数,实际上是class 的方法,不构成enclosing scope,其调用的变量需要通过instance,或者class 获取,但其与外层的def 构成enclosing scope,对外层的变量可以直接获取。下面上代码:

defgenerate():classspam:

count=1

defmethod(self):print(spam.count)return spam()

这段代码中,method与class并不形成enclosing scope,获取count,只能通过spam。

如果method直接打印count,如下:

defgenerate():classspam:

count=1

defmethod(self):print(count)return spam()

>>>generate().method()

Traceback (most recent call last):

File"", line 1, in generate().method()

File"", line 5, inmethodprint(count)

NameError: name'count' is not defined

而当count位于两个def 之间时,就构成了enclosing scope,就可以直接调用获取,如下:

defgenerate():

count=1

classspam:defmethod(self):print(count)return spam()

运行:

>>>generate().method()1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值