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
Python 笔试集(4):True + True == ?的更多相关文章
- Python 笔试集(2):你不知道的 Python 整数
面试题 分别给出下述代码在终端(e.g. IPyhon)中和在程序中的运行结果: a = 256 b = 256 c = 257 d = 257 def foo(): e = 257 f = 257 ...
- Python 笔试集(3):编译/解释?动态/静态?强/弱?Python 是一门怎样的语言
面试题 解释/编译?动态/静态?强/弱?Python 到底是一门怎样的语言? 编译 or 解释? 编译.解释都是指将(与人类亲和的)编程语言翻译成(计算机能够理解的)机器语言(Machine code ...
- Python 笔试集(1):关于 Python 链式赋值的坑
前言 Python 的链式赋值是一种简易型批量赋值语句,一行代码即可为多个变量同时进行赋值. 例如: x = y = z = 1 链式赋值是一种非常优雅的赋值方式,简单.高效且实用.但同时它也是一个危 ...
- Python 笔试集:什么时候 i = i + 1 并不等于 i += 1?
增强型赋值语句是经常被使用到的,因为从各种学习渠道中,我们能够得知 i += 1 的效率往往要比 i = i + 1 更高一些(这里以 += 为例,实际上增强型赋值语句不仅限于此).所以我们会乐此 ...
- Python while 1 和 while True 速度比较
References http://legacy.python.org/dev/peps/pep-0285/http://stackoverflow.com/questions/3815359/whi ...
- 『Python题库 - 填空题』151道Python笔试填空题
『Python题库 - 填空题』Python笔试填空题 part 1. Python语言概述和Python开发环境配置 part 2. Python语言基本语法元素(变量,基本数据类型, 基础运算) ...
- Python题集:2019春Python程序设计选修课习题笔记
一.判断题: 1-1.在Python 3.x中可以使用中文作为变量名. 答案:√ 1-2.Python变量使用前必须先声明,并且一旦声明就不能再当前作用域内改变其类型. 答案:× 1-3.Python ...
- ‘true’==true返回false详解
JavaScript高级程序设计(第3版) 第三章非常完整地解释了原因. 3.5.7 相等操作符 在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则: . 如果有一个操作数是布尔值,则在比较 ...
- boolean b=true?false:true==true?false:true;
下列代码的输出结果是_____ boolean b=true?false:true==true?false:true;System.out.println(b); 答案:false 题目来源:携程20 ...
随机推荐
- StanfordNLP for JAVA demo
最近工作需要,研究学习 NLP ,但是 苦于官方文档太过纷繁,容易找不到重点,于是打算自己写一份学习线路 NLP 路线图 好博客韩小阳 斯坦福NLP公开课 统计学习方法 好博客 链接地址:https: ...
- 【Java】 Java多线程(一)
一.对线程的理解 1.线程概念 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行 ...
- 总结linux内核的一些参数优化
sysctl命令被用于在动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中. 它包含一些TCP/IP堆栈和虚拟内存系统的高级选项, 用sysctl可以读取设置超过五百个系统变量. sy ...
- Linux系统,无法收到组播消息的问题
解决办法: 做以下3个修改 1. /etc/sysctl.conf 文件中的 net.ipv4.conf.all.rp_filter 设置成0 2. sysctl -w net.ipv4.conf.a ...
- PAT Basic 1076 Wifi密码 (15 分)
下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B-2:C-3:D-4:请同学们自己作答,每两日一 ...
- Codeforces Round #575 (Div. 3) (A. Three Piles of Candies)(数学)
A. Three Piles of Candies time limit per test1 second memory limit per test256 megabytes inputstanda ...
- JQuery 时间戳转时间
JQuery 时间戳转时间 var date = new Date(stocks[i]['create_time'] * 1000); var y = date.getFullYear(); var ...
- 重置grafana密码
[root@host~]# sqlite3 /var/lib/grafana/grafana.db SQLite version 3.7.17 2013-05-20 00:56:22 Enter &q ...
- windows2008r2防火墙设置一例
有台dell R420服务器,系统windows2008r2 扫描出安全漏洞,按照默认开启防火墙,结果远程桌面上不去了,远程桌面端口号是10086,需要在 控制面板\所有控制面板项\Windows 防 ...
- 一个web应用的诞生(3)
经过上一章的内容,其实就页面层来说已结可以很轻松的实现功能了,但是很明显美观上还有很大的欠缺,现在有一些很好的前端css框架,如AmazeUI,腾讯的WeUI等等,这里推荐一个和flask集成很好的b ...