Python中的'x = y或z'赋值是做什么的?

时间:2014-02-05 00:00:23

标签: python boolean variable-assignment

为什么我们会看到or的Python分配?

例如:

def my_function(arg_1=None, arg_2=0):
    determination = arg_1 or arg_2 or 'no arguments given!'
    print(determination)
    return determination

当没有参数调用时,上面的函数将打印并返回'no arguments given!'

为什么Python会这样做,以及如何才能最好地利用此功能?

1 个答案:

答案 0 :(得分:9)

or”表达式在赋值时的作用:

我们有时会在Python中看到这样的例子,作为带有三元赋值的条件表达式的替代,(事实上,it helped inspire the language to add conditional statements)。

x = a or b

如果bool(a)返回False,则会为x分配值b

条件表达式的相同用例(即三元分配)

这是一个完成同样事情的条件表达式的例子,但可能有点神秘。

def my_function(arg_1=None, arg_2=0):
    determination = arg_1 if arg_1 else arg_2 if arg_2 else 'no arguments given!'
    print(determination)
    return determination

过多地重复这种语法被认为是不好的风格,否则it's OK for one-liners.缺点是它 有点重复。

or表达式

基本情况x or y如果x评估x则返回True,否则评估y,(see the docs for reference)。因此,一系列or表达式具有返回评估True的第一个项目或最后一个项目的效果。

例如

'' or [] or 'apple' or () or set(['banana'])

返回'apple',第一个评估为True的项目和

'' or [] or ()

返回(),即使它的评估结果为False

扩展and用法

相比之下,如果x and y评估为x,则x会返回False,否则会返回y

当您考虑条件and系列中的所有条件需要评估为and以使控制流继续进行时,True将以这种方式工作是有意义的路径,当你遇到False时,继续评估这些项是没有意义的。

使用and进行分配的效用并不像使用or那样明显,但它在历史上用于三元分配。也就是说,在此之前,可以使用更清晰明了的构造:

a = x if condition else y

用布尔运算符形成的等价物是:

a = condition and x or z                      # don't do this!

虽然基于对Python语言的深入了解而衍生出来,但并不是那么简单,最好完全避免。

结论

必须小心使用布尔表达式进行赋值。绝对不要使用and进行赋值,这很容易让人容易出错。样式专家会发现or用于不太可取的作业(比更详细的三元if条件else),但我发现它在专业的Python社区中如此常见它可以被认为是惯用的。

如果您选择使用它,请谨慎行事,并了解最终元素将始终返回,无论其评估如何,因此最终元素应该是 literal ,以便您知道你的变量有一个很好的默认回退。