刨根问底: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 ...
随机推荐
- 2018 CISCN reverse wp
2018 CISCN reverse wp 这题比赛的时候没做出来,主要是心态崩了看不下去..赛后看了下网上的wp发现不难,是自己想复杂了.这里将我的思路和exp放出来,希望大家一起交流学习. mai ...
- (汇总)os模块以及shutil模块对文件的操作
''' # os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux ...
- python实现四则运算和效能分析
代码github地址:https://github.com/yiduobaozhi/-1 PSP表格: 预测时间(分钟) planning 计划 15 Estimate 估计这个任务需要多少时间 10 ...
- os模块介绍
一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台 ...
- Python_正则表达式样例
''' 正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串, 主要用于字符串处理,可以快速.准确地完成复杂的查找.替换等处理要求. 正则表达式由元字符 ...
- CSS伪类详情
参考:http://blog.csdn.net/Panda_m/article/details/50084699
- CentOS7下安装rabbitmq消息队
安装如下步骤: 1.首先安装erlang yum install erlang 注:如果出现No package erlang available. rpm -Uvh http://download. ...
- Spring Boot 使用 AOP 实现页面自适应
鉴于复杂页面自适应的难度,一般会做几套模板分别适应手机.平板.电脑等设备.使用 Spring Boot 开发单体应用时,一般会使用 Thymeleaf 模板,那么可以使用 AOP 技术来实现页面自适应 ...
- 架构选型之Nodejs与Java
前言: 身边越来越多的同事谈论Nodejs,谈其异步IO.事件回调.前后台统一一门语言,创业的朋友的第一个创业项目也选择了Nodejs,期望能够使用一种语言节省成本快速完成需求开发.与其他项目组的同事 ...
- AbstractRoutingDataSource实现动态数据源切换 专题
需求:系统中要实现切换数据库(业务数据库和his数据库) 网上很多资料上有提到AbstractRoutingDataSource,大致是这么说的 在Spring 2.0.1中引入了AbstractRo ...