刨根问底:if 后怎么就可以跟对象,变量交换写法是语法糖吗?
1、万物皆可布尔
一般语言中的 if 语句语法是这样的:
if (条件表达式)
{
执行语句
}
而在 Python 中,if 后面不仅可以是条件表达式,还可以是任意对象。例如:
my_list = [1, 2, 3]
if my_list:
print(my_list)
在 Python 中,False、None、数值 0、空序列、空映射都被视为 [假],其他各种值被视为 [真]。
那么,这是如何实现的呢?背后的原理是什么呢?
为了判定一个对象 x 为 [真] 还是 [假],Python 会调用 bool(x) 函数。该函数背后调用的是魔法方法 __bool__,如果不存在 __bool__ 方法,bool(x) 会尝试调用 __len__ 方法。若返回 0,则 bool(x) 返回 False,否则返回 True。
而默认情况下,我们自定义的类的实例总被认为是 [真]。
写个例子验证一下。
class MyClass:
def __bool__(self):
return False
my_class = MyClass()
if my_class:
print('真')
else:
print('假')
输出:
假
就是说:当对象用于任何需要表示为布尔值的时候,Python 会调用 bool(x) 方法,而我们可以通过重写 __bool__ 方法或 __len__ 方法改变默认的判断。
2、变量是如何交换的
Python 中交换两个变量非常简单:
b, a = a, b
为什么可以这样写,是语法糖吗?诚然不是,这是元组拆包。
不明白?写成这样是不是就明白了:
b, a = (a, b)
Python 解析器会自动将 a, b 视作元组,所以上面两个写法是等价的。不信?看下面的例子:
a = 1
b = 2
c = a, b
print(c)
print(type(c))
输出:
(1, 2)
<class 'tuple'>
所以 b, a = a, b 这种写法利用的是元组拆包。
刨根问底:if 后怎么就可以跟对象,变量交换写法是语法糖吗?的更多相关文章
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
比如有一个匿名对象,var result =......Select( a=>new { id=a.id, name=a.name});然后Object obj = result ;我怎 ...
- 关于javascript中的 执行上下文和对象变量
什么是执行上下文 当浏览器的解释器开始执行我们的js代码的时候,js代码运行所处的环境可以被认为是代码的执行上下文,执行上下文(简称-EC)是ECMA-262标准里的一个抽象概念,用于同可执行代码(e ...
- 实时错误 '91' :对象变量或with块变量未设置
大家这几天在做学生信息管理系统的时候,出现最多的应该就是这个问题了,“实时错误‘91’:对象变量或with块变量未设置”.如右图: 遇到这个问题,我们首先应该去参考MSDN,不过这时候MSDN似乎没有 ...
- sql server常有的问题-实时错误'91' 对象变量或with块变量未设置
这样的问题,对于我们这样的初学者来说,无疑是一个接触sql server后第一个艰难的问题,“实时错误'91' 对象变量或with块变量未设置”这句话到底透露出什么信息?直至写此博文,我依然看不出什么 ...
- java多线程系列(二)---对象变量并发访问
对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...
- hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了
hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了 例如session.save(user);user.setAge(20); 原因: hibernate对象的三种 ...
- Python的类变量和对象变量声明解析
Python的类和C++一样,也都是存在两种类型的变量,类变量和对象变量!前者由类拥有,被所有对象共享,后者由每个对象独有.这里我主要想讨论一下他们的声明办法. 首先说的是对象变量: 只要是声明在类的 ...
- 初次接触Object对象变量
Object 变量存储为 32 位(4 个字节)的地址形式,其为对象的引用.利用 Set 语句,声明为 Object 的变量可以赋值为任何对象的引用. 第一次注意到还有个数据类型,帮助文件里只有上面这 ...
- VB 对象变量或with块变量未设置
先看错误代码,以下代码提示 对象变量或with块变量未设置: Dim obj As Object obj = WebBrowser1.Document.getElementById("swi ...
随机推荐
- Java c# 跨语言Json反序列化首字母大小写问题
C#标准是首字母大写,Java规范是首字母小写,在序列化成Json之后,反序列化会出现反序列化失败的问题.. 从C#反序列化成JavaBean的时候通过如下注解可以直接解决该问题 @JsonNamin ...
- 界面渐变特效 -- CSS实现 -- 兼容IE8
特别注意:里面的RGB颜色值必须要全写,不能使用缩写.左右:background: -webkit-gradient(linear, 0 0, 0 100%, from(#80c1e7), to(#2 ...
- laravel5.4生成验证码
laravel5.4生成验证码 总结:本篇博客介绍使用gregwar/captcha实现验证码的具体操作步骤,以及可能遇到的问题和解决办法. 转载请注明出处!!!本文地址:http://www.c ...
- 团队项目第二阶段个人进展——Day4
一.昨天工作总结 冲刺第四天,分析完成后端处理的数据有主题,时间,地点,照片信息,前几个都是字符串类型,后一个是照片格式 二.遇到的问题 照片格式数据不知道怎么处理 三.今日工作规划 学习后端小程序后 ...
- 读《图解HTTP》有感-(HTTP首部)
写在前面 该章节是对请求报文及响应报文的首部信息进行解析.通过该章节的学习,相信大家对首部结构,及各个首部字段的作用有个基本的了解 正文 HTTP报文由HTTP报文首部.空行以及HTTP报文主体组成. ...
- PAT1079 :Total Sales of Supply Chain
1079. Total Sales of Supply Chain (25) 时间限制 250 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...
- PAT1029:Median
1029. Median (25) 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given an incr ...
- Myeclipse按包装SVN
最简单步骤:把features和plugins直接放到Myeclipse安装包的dropins中,从新启动eclipse即可 features和plugins下载地址:http://pan.baidu ...
- java.util.BitSet 详细分析 学习笔记
1,BitSet类 大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志. 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的 ...
- 微信公众号 模板消息 定时推送 java
前提:业务需要,要做一个关于月报的微信消息推送.即每个月定时自动发送一条消息 给关注 公众号的人 用的是 公众号的测试账号(实际开发需要认证的公众号) 微信官网的 模板消息接口规则: 1.所有服务号都 ...