带有变量赋值的Python隐式if语句——这是如何工作的?

带有变量赋值的Python隐式if语句——这是如何工作的?,python,if-statement,syntax,conditional,Python,If Statement,Syntax,Conditional,我在上个月开始学习python。我最近遇到了一个代码示例,其中代码中的计数器根据条件递增。作者的做法是: x = 0 x += [-1, 1][a == b] 从测试结果来看,如果a==b:increment,else:decreation,则这与使用时的效果相同。 我在python文档中查找过的其他任何地方都找不到这种语法。它似乎非常强大,允许各种条件赋值,并有助于简洁性 有什么理由我不应该使用这个结构吗?这个结构在做什么?[a==b]的计算结果是False或True,它们实际上是0或1,所

我在上个月开始学习python。我最近遇到了一个代码示例,其中代码中的计数器根据条件递增。作者的做法是:

x = 0
x += [-1, 1][a == b]
从测试结果来看,如果a==b:increment,else:decreation,则这与使用
时的效果相同。
我在python文档中查找过的其他任何地方都找不到这种语法。它似乎非常强大,允许各种条件赋值,并有助于简洁性


有什么理由我不应该使用这个结构吗?这个结构在做什么?

[a==b]
的计算结果是
False
True
,它们实际上是
0
1
,所以它被用作
[-1,1]
的索引

因此,当
a==b
得到
[-1,1][1]
(即
1
)或当它们不相等时,得到
[-1,1][0]
(即
-1
),然后将相应的值添加到
x
,表示:

坚持使用更明确、可读性更强、使用范围更广的版本:

x += 1 if a == b else -1

有人会称之为黑客,它可能很难阅读(这一问题证明了这一点),但它相当于:

x = 0
if(a == b):
    x += 1
else:
    x -= 1

因为
a==b
的(布尔)结果的整数版本是0或1。

a==b将是1或0
,所以
[-1,1]
的索引0或索引1我想指出,不建议在代码中使用它,因为这会让其他人,甚至是将来的你更难阅读。这不是一个很好的习惯,如果a==b else-1,就用
1来代替。更好的重复:啊,我不知道你可以用那样的bools。这样做有什么问题吗?@Sanalphatau最近最好使用alecxe建议的方法,因为它更具可读性,也更清楚意图是什么(事实证明,您必须询问发生了什么),接受了这一点,因为它直接回答了问题,尽管alecxe的评论与实际应用相关。公平地说,OP提到的作者可能只是在Python拥有内联
if
语法之前编写了这个表达式,这已经不是很久以前的事了。@Dolda2000可能,但阅读和理解这个表达式确实需要时间,它有点与众不同,至少需要一个额外的注释。@alecxe同意这样更具可读性。谢谢你的澄清。有没有否决的理由?不是我说的,但你的逻辑是错误的。我会把你重置为零。我唯一能想到的另一件事可能会让落选的选民感到恼火,那就是你事实上的“它很难阅读”。也许说“有些人可能会想……”会更好——而Python的禅宗语录中总是有这样一句话:P
x = 0
if(a == b):
    x += 1
else:
    x -= 1