Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python条件赋值运算符_Python_Variables_Conditional - Fatal编程技术网

Python条件赋值运算符

Python条件赋值运算符,python,variables,conditional,Python,Variables,Conditional,是否存在与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' 不,替换为: try: v except NameError: v = 'bla bla' 然而

是否存在与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'

不,替换为:

try:
   v
except NameError:
   v = 'bla bla'
然而,想要使用这个结构是代码流过于复杂的一个标志。通常,您会执行以下操作:

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

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

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

改用dicts:

d = {}
d.setdefault('key', 1)
d['key'] == 1

d['key'] = 2
d.setdefault('key', 1)
d['key'] == 2

我不确定我是否正确理解了这里的问题。。。尝试“读取”一个“未定义”变量名的值将触发一个
namererror
。(请参阅,而不是变量…)

==编辑==

正如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
>>> 

(请参阅)

我通常采用以下方法:

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

我很惊讶没有人给出这个答案。它不像Ruby的
| |=
那样“内置”,但基本上是等效的,仍然是一个单行程序:

foo = foo if 'foo' in locals() else 'default'
当然,它只是一本字典,所以您可以:

foo = locals().get('foo', 'default')
我会用

x = 'default' if not x else x
比这里建议的所有备选方案都要短得多,而且直截了当。阅读“如果未设置x,则将x设置为“默认值”,否则将其保留为x。”如果需要
None
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中缀符号,您可以按照这家伙的方法来重载
| |=|
(或类似的东西):

在Python 2.5和更高版本中有条件赋值-语法不是很明显,因此很容易出错。以下是您的操作方法:

x = true_value if condition else false_value
为了进一步的参考,请查看。

(不能评论,或者我会这么做)我认为上面关于检查本地人的建议不太正确。应该是:

foo = foo if 'foo' in locals() or 'foo' in globals() else 'default'
在任何情况下都要正确

然而,尽管它支持向上投票,但我认为即使是它也不能很好地模拟Ruby操作符。由于Ruby运算符允许在左侧使用的不仅仅是一个简单的名称:

foo[12] ||= something
foo.bar ||= something

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

我认为,如果您在字典中查找某个内容,您要查找的是
setdefault
方法:

(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
方法引用的键不存在时,
setdefault
方法才会更改字典。

如果未设置它,它不会设置它-如果它的当前值为false(
false
nil
),它会设置字典。诚然,这种区别在那些将0和“”视为false的语言中更为重要,但这个ruby操作符的用例是什么?方法是使用phihag指出的try-except-NameError,但这在Python中并没有任何意义,正如这里的每个人所说的那样。在Ruby中,由于人们传递任意代码块以在函数内部运行的方式,它更有用。目标函数可能需要设置未在其执行的外部块中初始化的变量。Python中没有这种情况。不,是你。@delnan我不想对
complex()
的性质做出具体假设。加上了,你确定@emish提供了一个简单得多的解决方案,这是一个糟糕的解决方案。它不仅更加复杂,而且性能也差得多。我建议将此解决方案从问题中删除。当值可能为0、“、空字符串或任何其他“falsy”时,此解决方案将立即中断。明确检查
是否为None
。哦,是的,你是对的,我没有想到这一点。谢谢你的提示!事实上,我从来没有必要做这个“或”的事情,我认为这是对这个问题的一个有效答案。。。但问题本身似乎与Python无关……您的第一个示例不起作用:>>>x='default'if not x else x Traceback(最近一次调用最后一次):文件“”,第1行,in NameError:name'x'未定义这是一个错误的答案,如果x不存在,将失败。因为这个问题要求一种测试存在性的方法,所以这个解决方案不起作用。这个答案解决了“条件赋值”问题。如果未设置变量,请设置该变量。当然,右边的所有内容都必须定义,否则会出现错误(我只是把它当作伪代码)
x=“value1”如果为真,则为“value2”
。总的来说
x='value1'如果条件为'value2'
这不是要求的条件。