Python:如果不存在则赋值

问题描述 投票:0回答:10

我是一名刚接触 Python 的 RoR 程序员。我正在尝试找到允许我将变量设置为特定值(仅当之前未分配该值时)的语法。基本上我想要:

# only if var1 has not been previously assigned

var1 = 4
python python-2.7 variable-assignment language-comparisons
10个回答
162
投票

您应该将变量初始化为

None
,然后检查它:

var1 = None
if var1 is None:
    var1 = 4

可以写成一行:

var1 = 4 if var1 is None else var1

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

None

var1 = var1 or 4

或者,如果您没有为变量分配任何内容,则变量名称不存在,因此稍后使用它会引发

NameError
,您也可以使用这些知识来做类似的事情

try:
    var1
except NameError:
    var1 = 4

但我建议不要这样做。


59
投票
var1 = var1 or 4

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


37
投票

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

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

if bar is None:
    bar = "Quux"

只是:

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

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


27
投票

我也来自 Ruby,所以我喜欢它的语法

foo ||= 7

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

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

我见过有人这样做是为了听写:

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

更新: 然而,我最近发现了这个宝石:

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

如果你喜欢这样,那么对于常规变量,你可以这样做:

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

18
投票

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

var1 = var1 or 4

仅当

4
var1
var1
None
 时,才会将 
False
 分配给 
0


7
投票

单行解决方案在这里:

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'
>>>

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

如果您想做的不仅仅是检查长度并附加到末尾,列表和元组解决方案将会更加复杂。尽管如此,这还是让您了解了您可以做什么。


0
投票

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

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

但常见的 Python 习惯用法是将其初始化为

None
(假设它不是可接受的值),然后使用
if var1 is not None
进行测试。


0
投票

在if条件中使用not条件即可

var1=None
if not var1:
  var1=4


0
投票

使用 1 个 if else 语句的整洁且可读的解决方案。

def xstr(s):
    return s if s else ''
© www.soinside.com 2019 - 2024. All rights reserved.