67

我是一名刚接触 Python 的 RoR 程序员。我试图找到允许我将变量设置为特定值的语法,前提是它之前没有分配。基本上我想要:

# only if var1 has not been previously assigned

var1 = 4
4

8 回答 8

129

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

var1 = None
if var1 is None:
    var1 = 4

可以写成一行:

var1 = 4 if var1 is None else var1

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

var1 = var1 or 4

或者,如果您没有为变量分配任何内容,则该变量名称不存在,因此稍后使用该变量将 raise NameError,您也可以使用该知识来做这样的事情

try:
    var1
except NameError:
    var1 = 4

但我建议不要这样做。

于 2011-09-07T18:13:22.193 回答
46
var1 = var1 or 4

这可能存在的唯一问题是,如果 var1 是一个虚假值,例如 False 或 0 或 [],它将选择 4。这可能是个问题。

于 2014-03-29T20:15:09.520 回答
36

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

bar = None
if foo():
    bar = "Baz"

if bar is None:
    bar = "Quux"

变成:

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

也就是说,我尽量避免出现一些代码路径定义变量而另一些不定义的情况。在我的代码中,从来没有一个路径会导致定义变量集的歧义(事实上,我通常会更进一步,并确保无论代码路径如何,类型都是相同的)。这可能只是个人喜好问题,但我发现这种模式虽然在我写它时不太明显,但当我稍后阅读它时更容易理解。

于 2011-09-07T18:24:38.093 回答
25

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

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

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

我见过人们为 dict 这样做:

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

更新: 但是,我最近发现了这个宝石:

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

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

vars()['foo'] = vars().get('foo', 7)
于 2016-04-18T09:01:08.593 回答
15

这是我使用的最简单的方法,希望对你有用,

var1 = var1 or 4

仅当is或4_ _var1var1NoneFalse0

于 2020-03-03T19:50:38.987 回答
4

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",)定义“单个”元组的逗号。)

如果您想做的不仅仅是检查长度并附加到末尾,那么列表和元组解决方案将更加复杂。尽管如此,这给人一种你可以做的事情的感觉。

于 2014-07-01T14:25:04.190 回答
4

这里的单线解决方案:

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

NameError此解决方案将设置var1default valueifvar1尚未定义,而不是具有。

这是它在 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'
>>>
于 2020-09-19T12:06:32.107 回答
1

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

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

但是常见的 Python 习惯用法是初始化它说None(假设它不是一个可接受的值),然后用if var1 is not None.

于 2011-09-07T18:15:44.417 回答