zoukankan      html  css  js  c++  java
  • 【Python】if 后怎么就可以跟对象?变量交换写法是语法糖吗?

    1、万物皆可布尔

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

    if (条件表达式)
    {
        执行语句
    }

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

    my_list = [123]
    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))

    输出:

    (12)
    <class 'tuple'>

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

  • 相关阅读:
    服务器建设问题
    JDBC --反射(二)
    Cookies
    http和https区别
    springboot常用注解
    线程池
    悲观锁和乐观锁
    java高并发下的数据安全
    idea解决mybatis逆向工程
    spring Cloud
  • 原文地址:https://www.cnblogs.com/gl1573/p/10709760.html
Copyright © 2011-2022 走看看