Python 条件赋值运算符

89 投票
10 回答
184632 浏览
提问于 2025-04-16 19:51

有没有和Ruby中的||=操作符(“如果变量没有设置,就给变量赋值”)相对应的Python写法呢?

下面是Ruby中的一个例子:

 variable_not_set ||= 'bla bla'
 variable_not_set == 'bla bla'

 variable_set = 'pi pi'
 variable_set ||= 'bla bla'
 variable_set == 'pi pi'

10 个回答

32

我会使用

x = 'default' if not x else x

这个方法比你们这里提到的其他所有方法都要简短,而且直接明了。可以理解为:“如果x没有被设置,就把x设为'default',否则就保持原来的x。”不过,如果你需要None0False或者""这些值也能被当作有效值的话,你就需要改变这个行为,比如:

valid_vals = ("", 0, False) # We want None to be the only un-set value

x = 'default' if not x and x not in valid_vals else x

这种情况其实很适合做成一个可以随处使用的函数:

setval_if = lambda val: 'default' if not val and val not in valid_vals else val

到时候,你可以这样使用它:

>>> x = None # To set it to something not valid
>>> x = setval_if(x) # Using our special function is short and sweet now!
>>> print x # Let's check to make sure our None valued variable actually got set
'default'

最后,如果你真的很想用Ruby那种中缀写法,你可以通过这个人的技巧来重载||=|(或者类似的东西):http://code.activestate.com/recipes/384122-infix-operators/

222

我很惊讶没有人提供这个答案。虽然它没有Ruby的||=那么“内置”,但基本上是等价的,而且还是一行代码:

foo = foo if 'foo' in locals() else 'default'

当然,locals()其实就是一个字典,所以你可以这样做:

foo = locals().get('foo', 'default')
16

不,这里应该用的是:

try:
   v
except NameError:
   v = 'bla bla'

不过,如果你想用这种写法,那说明你的代码可能太复杂了。通常,你应该这样做:

try:
   v = complicated()
except ComplicatedError: # complicated failed
   v = 'fallback value'

这样就不会担心 v 是否被设置了。如果有很多选项可以选择设置或者不设置,建议使用字典和它的 get 方法,这样可以设定一个默认值。

撰写回答