Python:如果不存在则分配值

Spe*_*cer 45 python language-comparisons variable-assignment python-2.7

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

__CODE__

__CODE__

Anu*_*yal 84

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

var1 = None
if var1 is None:
    var1 = 4
Run Code Online (Sandbox Code Playgroud)

哪一行可以写成:

var1 = 4 if var1 is None else var1
Run Code Online (Sandbox Code Playgroud)

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

var1 = var1 or 4
Run Code Online (Sandbox Code Playgroud)

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

try:
    var1
except NameError:
    var1 = 4
Run Code Online (Sandbox Code Playgroud)

但我会建议反对.

  • 如果var1为'0',`var1 = var1或4`可能会伤害你,因为`0`是一个假值,因此`0或4`评估为'4',这不是你在这种情况下不会的.您可以在https://docs.python.org/2/library/stdtypes.html#truth-value-testing中查看哪些其他内容评估为"false" (6认同)
  • 由于后面的赋值(在`except`中),`var1`是一个局部变量,除非该片段在模块(即全局)级别或者有一行"global var1".访问尚未分配的局部变量会引发`UnboundLocalError`而不是`NameError`(为全局名称保留). (2认同)

Sin*_*ion 29

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

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

if bar is None:
    bar = "Quux"
Run Code Online (Sandbox Code Playgroud)

进入:

if foo():
    bar = "Baz"
else:
    bar = "Quux"
Run Code Online (Sandbox Code Playgroud)

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

  • 如果foo()还有"Quux",那么甚至可以使用`bar ="Baz"在单行中缩短 (50认同)
  • 请注意,如果任何预期值都是虚假的(例如,“ False”,“ 0”,“''”,“ []”,“ {}”),此操作将失败。如果x为其他x,则最好说x = y。 (3认同)

uba*_*dub 25

var1 = var1 or 4
Run Code Online (Sandbox Code Playgroud)

这可能有的唯一问题是,如果var1是假值,如False或0或[],它将选择4.这可能是一个问题.

  • 请参阅[真值测试](https://docs.python.org/2/library/stdtypes.html#truth-value-testing)以获取评估为False的完整列表,其中一些可能会让一些人感到惊讶. (7认同)

l__*_*__l 15

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

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

foo = foo if 'foo' in vars() else 7
Run Code Online (Sandbox Code Playgroud)

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

try:
    foo['bar']
except KeyError:
    foo['bar'] = 7
Run Code Online (Sandbox Code Playgroud)

Upadate: 不过,我最近发现了这个宝石:

foo['bar'] = foo.get('bar', 7)
Run Code Online (Sandbox Code Playgroud)

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

vars()['foo'] = vars().get('foo', 7)
Run Code Online (Sandbox Code Playgroud)

  • @CodeKid `self.foo = self.__dict__.get('foo', 7)` (3认同)
  • @CodeKid 或者,`self.foo = getattr(self, 'foo', 7)` (2认同)

Dee*_*lue 12

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

var1 = var1 or 4

这仅分配4var1如果var1NoneFalse0


小智 9

这里的单行解决方案:

var1 = locals().get("var1", "default value")
Run Code Online (Sandbox Code Playgroud)

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'
>>>
Run Code Online (Sandbox Code Playgroud)