为什么这个三元运算符语法是无效的?

5

我正在尝试编写一个简单的三元运算符,它在Ruby中看起来像这样:

0 > 1 ? alice+=1 : bob+=1

我用Python写成了这样:

alice += 1 if 0 > 1 else bob += 1

这个三元运算符会在bob+=1处抛出无效语法错误。为什么会发生这种情况,我该如何使第二个操作符和第一个操作符执行相同的操作?


3
三元运算符中只能写表达式,不能写语句。 - Willem Van Onsem
3
因为bob += 1是一个语句而不是表达式。 - mgilson
我该如何渲染 bob+=1 表达式?为什么 alice+=1 是一个表达式,而 bob+=1 却是一个语句? - d00medman
1
这两个都是增强赋值语句,而不是表达式。不清楚你想要什么。 - juanpa.arrivillaga
在Python中,赋值永远不能是表达式。但是,您可以将逻辑封装在一个函数中并调用该函数(函数调用是一个表达式)。 - juanpa.arrivillaga
1个回答

7

三元表达式是一种表达式,你试图将其用作单行if-then-else。你可以选择增量值,该值来自等式的右侧,例如:

alice += 1 if bob > 1 else 0

...但是你不能像这样更改分配的目标。 如果你真的需要这样做,你可以将一个自定义元组分配给LHS alice,bob,但这似乎有些过度了。 只需使用自然的if语句即可。

if 0 > 1:
    alice += 1
else:
    bob += 1

最终执行的代码保持不变,源代码更易读。

好的,这很有道理。那么 Python 中的三元运算符与 Ruby 中的有很大不同?它似乎更适用于变量的赋值,而不是语句的评估。Python 是否缺乏以这种简洁的方式执行布尔逻辑的能力? - d00medman
好的。大多数带有所谓“三元”运算符的语言使用传统的定义。像C或Ruby这样的表达式导向型语言可以选择将完整语句作为表达式。Python和C选择不走得那么远;而Ruby则选择了这种方式。 - Prune
Python非常擅长逻辑路径。在理论文档中可能有解释三元运算符为什么会这样工作的内容,但我还没有去找它。 - Prune
然而,在Python中的赋值语句并不返回任何值;这种级联赋值只是一种语法上的便利。print(bob = 1)会得到一个语法错误,而不是1 - Prune
1
@Prune 好的,我明白了,我意识到 C 以经验结果而闻名,并不一定表明标准......但是我对 C 标准并不熟悉,也许确实有写明“赋值语句不能用于三目运算符”之类的规定。 - juanpa.arrivillaga
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接