zoukankan      html  css  js  c++  java
  • Python 笔试集(4):True + True == ?

    目录

    前文列表

    Python 笔试集:什么时候 i = i + 1 并不等于 i += 1?
    Python 笔试集(1):关于 Python 链式赋值的坑
    Python 笔试集(2):你不知道的 Python 整数
    Python 笔试集(3):编译/解释?动态/静态?强/弱?Python 是一门怎样的语言

    面试题:True + Ture == ?

    Python 的 “+” 号会根据操作对象数据类型的不同而进行重载,操作对象为数字类型时,它是算术运算符;操作对象为序列类型时,它是序列连接符。

    In  : 1 + 1
    Out : 2
    
    In  : 'abc' + '123'
    Out : ‘abc123'

    那么问题是:如果操作对象为布尔类型呢?
    你是否会认为 True + True == True?或者其他的结果,在揭晓答案前,首先需要了解一下 Python 的布尔数据类型。

    布尔值

    布尔数据类型只有 True or False 两个值,它作为逻辑判断的基准被应用在程序各处的布尔上下文中(e.g. if、while、for 等逻辑控制语句)。

    虽然我们也会经常在布尔上下文中使用表达式语句(e.g. i > 0)或其他数据类型对象(e.g. 1, ’abc’)作为判断的依据,但实际上无论使用何种方式最终得到的结果都是一个布尔值。

    • 表达式返回值:
    In  : i = 2
    
    In  : i > 1
    Out : True
    • 自定义对象返回布尔值:
      如果一个自定义对象实现了 __nonzero__ 特殊方法(Python 3.x 为 __bool__),那么当对象存在于布尔上下文或使用内置函数 bool 来进行处理时,该特殊方法就会被隐式的调用。
    class TestBool(object):
        def __nonzero__(self):
            print("[*] Call TestBool.__nonzero__")
            return True
    
    if __name__ == '__main__':
        print("Invoked function bool: %s" % bool(TestBool()))
        if TestBool():
            print("TestBool() return True.")
        else:
            print("TestBool() return False.”)

    OUTPUT

    [*] Call TestBool.__nonzero__
    Invoked function bool: True
    
    [*] Call TestBool.__nonzero__
    TestBool() return True.

    当然,除了自定义对象之外,Python 所有的非空内置对象在布尔上下文中都会被当作 True 来处理,反之则会被当成 False 来处理

    这里写图片描述
    (Python 真值表)

    布尔类型是特殊的整数类型

    布尔类型对象之所以能够支持常规的算术运算,是因为布尔类型根本就是整数类型的一个子类,布尔类型对象继承了大量的整数类型方法。例如:__eq____add__ 等。

    In  : bool.__bases__
    Out : (int,)
    
    In  : True == 1
    Out : True
    
    In  : True + True
    Out : 2
    
    In  : True + 1
    Out : 2

    但需要注意的是,即便 True 和 1 的 Value 是相同的,但两者却不可能是同一个对象,因为两者的 Type 不同。(ps. 只有两个对象的 Id、Value、Type 都相同时,才能被判定为同一个对象。)

    In  : True is 1
    Out : False
    
    In  : type(True), type(1)
    Out : (bool, int)

    最后值得一提的是:当我们使用增强型赋值运算符来操作布尔类型对象时,到底会发生什么样的事情呢?

    In  : type(True)
    Out : bool
    
    In  : id(True)
    Out : 140735725425440
    
    In  : True += 1
    
    In  : True
    Out : 2
    
    In  : type(True)
    Out : int
    
    In  : id(True)
    Out : 140618394261472

    在 Python 2.x 中,以上的操作在语法层面是被允许的,因为 Python 2.x 中的 True or False 只是 LEBG 作用域命名空间中的一个变量名。

    通过 type 和 id 函数可以看出,在上述代码中其实存在着两个不同的 True 对象。一个 Python 内置的布尔类型对象 True,一个是新建的整数类型对象 “True”。**实际上当我们执行 True += 1 时,并没有直接修改位于 Builtin 内置作用域中 True 对象,而是在 Local 本地作用域中创建了一个新的变量对象 “True”。

    当我们在同一个本地作用域中 Delete 掉 “True” 对象的引用之后,内置作用域中的 True 又会重新出现,这是因为 Python 访问变量的作用域顺序为「L -> E -> G -> B」。**

    In  : True == __builtins__.True
    Out : False
    
    In  : del(True)
    
    In  : True
    Out : True

    显然,Python 2.x 中的这种特性是非常危险的。假如你想报复社会,只需要在 Python 模块中写入 True, False = False, True 即可。

    正因如何,Python 3.x 中 True or False 正式变成了不允许被赋值的保留字,即向 True or False 赋值时,会触发以下的语法错误。

    In [16]: if = 1
      File "<ipython-input-16-1d628f72fdfd>", line 1
        if = 1
           ^
    SyntaxError: invalid syntax
  • 相关阅读:
    2017.08.07 python爬虫实战之使用代理爬取糗事百科
    2017.08.05 Python网络爬虫实战之获取代理
    2017.08.04 Python网络爬虫之Scrapy爬虫实战二 天气预报的数据存储问题
    2017.08.04 Python网络爬虫之Scrapy爬虫实战二 天气预报
    2017.07.28 Python网络爬虫之爬虫实战 重新梳理------今日影视爬虫(使用Scrapy爬取ajax动态页面)
    2017.07.28 Python网络爬虫之爬虫实战 今日影视2 获取JS加载的数据
    RabbitMQ之工作队列
    pt-online-schema-change和默认值关系
    flex词法解析
    Makefile持续学习二
  • 原文地址:https://www.cnblogs.com/jmilkfan-fanguiju/p/10589786.html
Copyright © 2011-2022 走看看