x = 'foo' if x == 'bar' else x
现在这等于:
x = 'foo' if x == 'bar'
但这会返回“无效语法”错误。是否有这样的原因,或者设计决策背后的原因是什么?因为它是多行的函数(函数如#2):
if x == 'foo':
x = 'bar'
它完美无缺。
答案 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'