【 Python 】Python中的小细节

一、python中的变量作用域

python中的变量作用域只有class,def(lambda),model 会引入新的变量作用域。
if-else \ for \ while \ try-except 均不会形成新的变量作用域,也就是在这些块中定义的变量,并不会独属于这个块,而是会放到这个块的父级中,如果父级还是这些块,则继续向上找,直到class,def,model为止

并且还有一个比较特色的一点:

def fun():
    def h():
        print(id(k))
    h()
    k = "hhh"
fun()

像上面这种情况,报的错误是free variable ‘k’ referenced before assignment in enclosing scope,也就是报的是k变量在被赋值前引用,说明什么,说明解释器已经知道这是一个变量了,但是就是还没赋值,就是在执行内嵌函数的时候,哪怕这时候k还没有被赋值,但是已经被知道了。

def fun():
    def h():
        print(id(k))
    h()
    # k = "hhh"
fun()

如果注销的话,则报这个错误 name ‘k’ is not defined,和上面的错误完全不同,这不禁让人想到与js相关的预编译技术,就是提前预编译一遍(Python在编译一个函数的时候,会分析这个函数中用到的变量名,具体到确定某个变量是不是局部变量的规则也很简单,局部变量作用域的实现就有些不同,它们在编译阶段就已经被定下来了),收集所有的信息,将变量上升到当前作用域最高的地方,然后再进行下一次编译。

def fun():
    def h():
        print(id(k))
    h()
    # k = "hhh"

fun()
k = "hhhh"

这种情况下,报错name ‘k’ is not defined,,,,最终我试了一下,只有在model作用域下(我觉得原因在于全局变量本质上是作为本model的一个属性存在的,而一个函数在执行的时候会创建一个栈帧,主要用来存放局部变量),才不会出现预编译的情况,直接报变量没有定义,在class和def下,都是会报赋值前引用的错误。

二、None False True

在python中,一切皆对象,所以在python中,没有null的概念,用None来代替null,在python中,None对象是唯一的,只有一个,所以对于None可以放心的使用is

在python中,None,0,空列表,空字典,空集合,都被默认为False,但是他们都不是真正意义上的False,只是在bool(None) = False 罢了

其次对于False和True,是否只有一个实例,网上众说纷云,所以尽量少用 is 啥的,因为 is 判断的是id

对于is,同样的也有is not ,他们都是判断的是id

这么说来,好像None和True/False这些东西,都没有实际上的应用意义了,None只对于None本身才有 == 和 is 的有意义,而True和False,一般就不用 = = 和 is 了,直接就用了,没必要非得再判一次等

== 判等用的是一个方法_eq_ 而 is 判等用的是id地址

在Python3.x 中,终于把True/False两变量变成了关键字,也就是说,程序员再也没法给这两变量赋新的值了,从此True永远指向真对象,False指向假对象,永不分离。用keyword模块检测True 和False 是否为关键字。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值