前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >刨根问底:if 后怎么就可以跟对象,变量交换写法是语法糖吗?

刨根问底:if 后怎么就可以跟对象,变量交换写法是语法糖吗?

作者头像
丹枫无迹
发布2019-04-22 11:59:50
4840
发布2019-04-22 11:59:50
举报
文章被收录于专栏:学无止境

1、万物皆可布尔

一般语言中的 if 语句语法是这样的:

代码语言:javascript
复制
if (条件表达式)
{
    执行语句
}

而在 Python 中,if 后面不仅可以是条件表达式,还可以是任意对象。例如:

代码语言:javascript
复制
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

而默认情况下,我们自定义的类的实例总被认为是 [真]。

写个例子验证一下。

代码语言:javascript
复制
class MyClass:
    def __bool__(self):
        return False


my_class = MyClass()

if my_class:
    print('真')
else:
    print('假')

输出:

代码语言:javascript
复制

就是说:当对象用于任何需要表示为布尔值的时候,Python 会调用 bool(x) 方法,而我们可以通过重写 __bool__ 方法或 __len__ 方法改变默认的判断。

2、变量是如何交换的

Python 中交换两个变量非常简单:

代码语言:javascript
复制
b, a = a, b

为什么可以这样写,是语法糖吗?诚然不是,这是元组拆包。 不明白?写成这样是不是就明白了:

代码语言:javascript
复制
b, a = (a, b)

Python 解析器会自动将 a, b 视作元组,所以上面两个写法是等价的。不信?看下面的例子:

代码语言:javascript
复制
a = 1
b = 2
c = a, b
print(c)
print(type(c))

输出:

代码语言:javascript
复制
(1, 2)
<class 'tuple'>

所以 b, a = a, b 这种写法利用的是元组拆包。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、万物皆可布尔
  • 2、变量是如何交换的
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档