【问题标题】:Understanding Python coalescing operators [duplicate]了解 Python 合并运算符 [重复]
【发布时间】:2016-03-19 15:49:21
【问题描述】:

以下代码行在 Python 中是什么意思?

id = result and result[1] or False

注意:这个问题结合了运算符“and”和“or”。但是,“Stackoverflow”中提出的其他问题考虑到语句中只有这些运算符之一。

【问题讨论】:

    标签: python python-2.7 variable-assignment


    【解决方案1】:

    这似乎是为了避免在序列 result(例如列表、元组)包含少于 1 个项目时引发 IndexError。但是,如果这是有意为之,那就有缺陷了,因为 Python 序列是从 0 开始的,result[1] 访问序列中的 second 项。检查列表不为空并不能保证第二个项目存在。可能目的是检查序列中是否至少有 一个 项,并获取序列中的 第一个 项,而不是第二个。

    而且,由于短路,or False 实际上是多余的。

    这是if 声明的简写方式:

    if result:
        id = result[1]
    else:
        id = False
    

    但正如我所说,它似乎有缺陷。这样会更好:

    try:
        id = result[1]
    except IndexError:
        id = False
    

    或执行长度检查:

    if len(result) > 1:
        id = result[1]
    else:
        id = False
    

    或:

    id = result[1] if len(result) > 1 else False
    

    或者继续问题中可怕的内联方法:

    id = (len(result) > 1) and result[1]
    

    这只是强调了代码不应该以问题所示的方式编写:目前尚不清楚代码的意图和结果是什么,需要一些思考才能理解它。 if 语句更具可读性,因此应该使用它。

    【讨论】:

    • 另外值得注意的是,例如,如果result[1] = 0,它可能与您的if 语句完全不一样。
    【解决方案2】:

    这是该行的等效 Python 代码:

    if result:
        id = result[1]
    else:
        id = False
    

    基本意思是:

    如果result 的计算结果为True,则将id 分配给result 列表的第二个元素,否则将id 分配为布尔值False

    【讨论】:

      【解决方案3】:

      该代码将 result[1] 项目(列表的第二项或第二个字母 rom 字符串)分配给 id 变量,如果它存在,否则 False 将分配给 id。

      注意如果结果列表仅包含 1 个项目,则代码将失败并显示 IndexError

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-31
        • 2019-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        相关资源
        最近更新 更多