python变量赋值方式_变量-Python条件赋值运算

变量-Python条件赋值运算

是否存在与Ruby 2946449421195805805运算符等效的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个解决方案

139 votes

我很惊讶没有人提供这个答案。 它不像Ruby的locals()那样“内置”,但基本上是等效的,并且仍然是单一的:

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

当然,locals()只是一本字典,因此您可以执行以下操作:

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

Keith Devens answered 2020-06-30T23:30:22Z

18 votes

不,替换为:

try:

v

except NameError:

v = 'bla bla'

但是,想要使用此构造是代码流程过于复杂的标志。 通常,您需要执行以下操作:

try:

v = complicated()

except ComplicatedError: # complicated failed

v = 'fallback value'

并且永远不要确定是否设置了get。 如果它是可以设置或不能设置的许多选项之一,请使用字典及其允许默认值的get方法。

phihag answered 2020-06-30T23:29:58Z

15 votes

我会用

x = 'default' if not x else x

比这里建议的所有替代方案都短得多,而且直截了当。 阅读,“如果未设置x,则将x设置为'default',否则将其保持为x。” 但是,如果您需要||=|、0、False或""是有效值,则需要更改此行为,例如:

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中的符号表示法,则可以通过关注此家伙的hack来使||=|(或类似内容)超载:[http://code.activestate.com/recipes/384122-infix-operators/]

emish answered 2020-06-30T23:31:00Z

4 votes

不,不知道定义了哪些变量是一个错误,而不是Python中的功能。

改用dicts:

d = {}

d.setdefault('key', 1)

d['key'] == 1

d['key'] = 2

d.setdefault('key', 1)

d['key'] == 2

Jochen Ritzel answered 2020-06-30T23:31:24Z

3 votes

(不能发表评论,否则我只会这样做)我认为上述检查当地人的建议并不完全正确。 它应该是:

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

在所有情况下都是正确的。

但是,尽管有人投票赞成,但我认为这与Ruby运算符也不是很好的相似之处。 由于Ruby运算符允许的不只是左侧的简单名称:

foo[12] ||= something

foo.bar ||= something

异常方法可能是最接近的模拟。

Jas answered 2020-06-30T23:31:58Z

1 votes

我通常通过以下方式执行此操作:

def set_if_not_exists(obj,attr,value):

if not hasattr(obj,attr): setattr(obj,attr,value)

Dog eat cat world answered 2020-06-30T23:32:17Z

1 votes

在Python 2.5及更高版本中有条件赋值-语法不是很明显,因此很容易遗漏。 这是您的操作方式:

x = true_value if condition else false_value

有关更多参考,请查看Python 2.5文档。

mainas answered 2020-06-30T23:32:42Z

0 votes

我认为您要寻找的是setdefault20方法:

(Pdb) we=dict()

(Pdb) we.setdefault('e',14)

14

(Pdb) we['e']

14

(Pdb) we['r']="p"

(Pdb) we.setdefault('r','jeff')

'p'

(Pdb) we['r']

'p'

(Pdb) we[e]

*** NameError: name 'e' is not defined

(Pdb) we['e']

14

(Pdb) we['q2']

*** KeyError:“ q2” (Pdb)

在我的示例中要注意的重要一点是,当且仅当setdefault方法所引用的键不存在时,29464528817314867867方法才会更改字典。

user1928764 answered 2020-06-30T23:33:11Z

-1 votes

我不确定我在这里是否正确理解了这个问题……尝试“读取”“未定义”变量名称的值将触发NameError(请参阅此处,Python具有“名称”,而不是变量...)。

==编辑==

正如delnan的评论所指出的那样,下面的代码并不强大,并且会在许多情况下中断...

不过,如果您的变量“存在”但具有某种虚拟值,例如None,则可以使用以下方法:

>>> my_possibly_None_value = None

>>> myval = my_possibly_None_value or 5

>>> myval

5

>>> my_possibly_None_value = 12

>>> myval = my_possibly_None_value or 5

>>> myval

12

>>>

(有关真值,请参见本段)

tsimbalar answered 2020-06-30T23:33:49Z

-8 votes

不,这不是胡说八道。我们20年来在Python中从未错过的东西。

Andreas Jung answered 2020-06-30T23:34:09Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值