前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每周四更面试题:True+True=?

每周四更面试题:True+True=?

作者头像
企鹅号小编
发布2018-01-22 14:33:18
7600
发布2018-01-22 14:33:18
举报
文章被收录于专栏:企鹅号快讯企鹅号快讯

面试题:True + Ture == ?

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

那么问题是:如果操作对象为布尔类型呢?

你是否会认为?在揭晓答案前,首先了解一下 Python 的布尔数据类型。

布尔值

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

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

表达式返回值:

自定义对象返回布尔值:

如果一个自定义对象实现了特殊方法(Python 3.x 为),那么当对象存在于布尔上下文或使用内置函数 bool 来进行处理时,该特殊方法就会被隐式的调用。

OUTPUT:

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

(Python 真值表)

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

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

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

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

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

通过 type 和 id 函数可以看出,在上述代码中其实存在着两个不同的 True 对象。一个 Python 内置的布尔类型对象 True,一个是新建的整数类型对象 “True”。

实际上当我们对 True 使用增强型赋值操作符时,并没有直接修改位于 Builtin 内置作用域中 True 对象,而是在 Local 本地作用域中创建了一个新的变量对象 “True”。

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

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

也正因如何,Python 3.x 中 True or False 正式变成了不允许被赋值的保留字,强行赋值则会触发类型下列的语法错误。

JmilkFan-范桂飓

专注于 Python、云计算与大数据

技术即沟通

下一位 offer 达人,就是你 !!

本文来自企鹅号 - JmilkFan媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - JmilkFan媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档