为什么内联IF赋值需要else语句?

时间:2014-12-31 22:55:03

标签: python

x = 'foo' if x == 'bar' else x

现在这等于:

x = 'foo' if x == 'bar' 

但这会返回“无效语法”错误。是否有这样的原因,或者设计决策背后的原因是什么?因为它是多行的函数(函数如#2):

if x == 'foo':
    x = 'bar'

它完美无缺。

3 个答案:

答案 0 :(得分:7)

对于Python解释器,这行代码......

x = 'foo' if x == 'bar' else x

不是解释为......

(x = 'foo') if x == 'bar' else (x = x)

而是解释如下:

x = ('foo' if x == 'bar' else x)

这是因为Python中的三元x if cond else y运算符是表达式而不是语句 - 它可以在您指定值的任何地方使用。

因此,您也可以使用它,例如,在您没有完成任务的情况下:

print("hi" if x == 'bar' else "bye")

因为它是一个表达式,所以它总是需要能够解析为某个值,以便可以在表达式使用的任何上下文中使用该值。

答案 1 :(得分:6)

这是因为它不是陈述而是表达。它必须评估某些内容,因此您无法排除else条件。此外,因为它是一个表达式,你不能(实际上,你不应该)做任何会改变状态的事情。

此处有更多信息:https://docs.python.org/2/reference/expressions.html#conditional-expressions

当然,这样的事情是完全可能的:

class C(object):
    def foo(self):
        self.y = 1
        return 'foo'

c = C()

c.foo() if True else 'bar'

print c.y

# Prints '1'

......所以三元表达中的变异状态实际上并未被禁止;它只是不推荐。

答案 2 :(得分:2)

蟒蛇口头禅说应该只有一种方法可以做。我们已经有了:

if x == 'foo': x = 'bar'

我们为什么要这样做:

x = 'bar' if x == 'foo'