Python:如果不存在则分配值

时间:2011-09-07 18:08:47

标签: python ruby python-2.7 variable-assignment language-comparisons

我是Python新手的RoR程序员。我试图找到允许我将变量设置为特定值的语法,只有先前未分配。基本上我想要:

# only if var1 has not been previously assigned

var1 = 4

8 个答案:

答案 0 :(得分:75)

您应该将变量初始化为None,然后检查它:

var1 = None
if var1 is None:
    var1 = 4

可以在一行中写成:

var1 = 4 if var1 is None else var1

或使用快捷方式(但建议检查无)

var1 = var1 or 4

或者,如果你没有任何分配给变量的变量名称不存在,那么稍后使用它会引发NameError,你也可以使用这些知识做这样的事情

try:
    var1
except NameError:
    var1 = 4

但我建议反对。

答案 1 :(得分:25)

这是一种非常不同的编程风格,但我总是试图重写看起来像

的东西
bar = None
if foo():
    bar = "Baz"

if bar is None:
    bar = "Quux"

进入公正:

if foo():
    bar = "Baz"
else:
    bar = "Quux"

也就是说,我努力避免某些代码路径定义变量但其他代码路径没有定义变量的情况。在我的代码中,永远不会有一个导致定义变量集模糊的路径(事实上,我通常更进一步,并确保类型是相同的,无论代码路径如何)。这可能仅仅是个人品味的问题,但我发现这种模式虽然在我写作时有点不那么明显,但是当我以后阅读它时更容易理解。

答案 2 :(得分:24)

var1 = var1 or 4

唯一可能的问题是,如果var1是假值,如False或0或[],则会选择4。这可能是一个问题。

答案 3 :(得分:13)

我也来自Ruby,所以我喜欢语法foo ||= 7

这是我能找到的最接近的东西。

foo = foo if 'foo' in vars() else 7

我见过人们这样做是为了一个字典:

try:
    foo['bar']
except KeyError:
    foo['bar'] = 7

<强> Upadate: 但是,我最近发现了这个宝石:

foo['bar'] = foo.get('bar', 7)

如果您喜欢,那么对于常规变量,您可以执行以下操作:

vars()['foo'] = vars().get('foo', 7)

答案 4 :(得分:3)

IfLoop的答案(以及MatToufoutu的评论)对于独立变量非常有用,但我想为任何试图为列表,元组或词典中的单个条目做类似事情的人提供答案。

<强>字典

existing_dict = {"spam": 1, "eggs": 2}
existing_dict["foo"] = existing_dict["foo"] if "foo" in existing_dict else 3

返回{"spam": 1, "eggs": 2, "foo": 3}

<强>解释

existing_list = ["spam","eggs"]
existing_list = existing_list if len(existing_list)==3 else 
                existing_list + ["foo"]

返回["spam", "eggs", "foo"]

<强>元组

existing_tuple = ("spam","eggs")
existing_tuple = existing_tuple if len(existing_tuple)==3 else 
                 existing_tuple + ("foo",)

返回("spam", "eggs", "foo")

(不要忘记("foo",)中的逗号来定义“单个”元组。)

如果您想做的不仅仅是检查长度并追加到最后,那么列表和元组解决方案会更复杂。尽管如此,这可以说明你能做些什么。

答案 5 :(得分:1)

如果你的意思是模块级别的变量,那么你可以使用“globals”:

if "var1" not in globals():
    var1 = 4

但常见的Python惯用法是将其初始化为None(假设它不是可接受的值),然后使用if var1 is not None进行测试。

答案 6 :(得分:1)

这是我最简单的使用方式,希望对您有用,

true

仅当var1 = var1 or 44var1var1时,这会将None分配给False

答案 7 :(得分:0)

单线解决方案:

var1 = locals().get("var1", "default value")

如果尚未定义NameError,则此解决方案将var1设置为default value,而不是使用var1

这是在Python交互式shell中的样子:

>>> var1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'var1' is not defined
>>> var1 = locals().get("var1", "default value 1")
>>> var1
'default value 1'
>>> var1 = locals().get("var1", "default value 2")
>>> var1
'default value 1'
>>>