【Python】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
这种写法利用的是元组拆包。