一行if条件赋值

211 投票
14 回答
488879 浏览
提问于 2025-04-17 04:52

我有以下这段代码

num1 = 10
someBoolValue = True

我需要在someBoolValueTrue的时候,把num1的值设为20;如果不是,就什么都不做。所以,我写了这样的代码

num1 = 20 if someBoolValue else num1

有没有什么方法可以避免...else num1这一部分,让代码看起来更简洁?也就是说,想找一个和这个效果相同的写法

if someBoolValue:
    num1 = 20

我试着把它换成...else pass,像这样写:num1=20 if someBoolValue else pass。结果我只得到了语法错误。而且我也不能直接省略...else num1这一部分。

14 个回答

40

对于未来从谷歌来的时间旅行者,这里有一种新的方法(从Python 3.8开始可以使用):

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)

这被称为“海象运算符”。更多信息可以查看Python 3.8的新特性页面。

71

使用这个:

num1 = 20 if someBoolValue else num1
311

我觉得在Python里这可能做不到,因为你实际上想做的事情可能会变成这样:

num1 = 20 if someBoolValue else num1

如果你去掉 else num1,你会收到一个语法错误,因为我很确定赋值操作必须返回一些东西。

正如其他人提到的,你可以这样做,但这不好,因为下次你再看那段代码时,可能会让自己搞糊涂:

if someBoolValue: num1=20

我也不太喜欢 num1 = someBoolValue and 20 or num1,原因是一样的。我得认真想想那行代码到底在干嘛。

其实实现你想做的事情最好的方法是用原来的写法:

if someBoolValue:
    num1 = 20

之所以这样写是最好的版本,是因为你想做的事情非常明显,这样你自己不会搞混,也不会让其他以后接触这段代码的人困惑。

另外,顺便提一下, num1 = 20 if someBoolValue 是有效的Ruby代码,因为Ruby的工作方式有点不同。

撰写回答