在c#中,有一个空合并操作符(写为??),允许在赋值时简单(短)检查空值:

string s = null;
var other = s ?? "some default value";

python中有等效的吗?

我知道我能做到:

s = None
other = s if s else "some default value"

但是有没有更短的方法(我不需要重复s)?


当前回答

对于那些像我一样跌跌撞撞地在这里寻找一个可行的解决方案,当变量可能是未定义的,我得到的最接近的是:

if 'variablename' in globals() and ((variablename or False) == True):
  print('variable exists and it\'s true')
else:
  print('variable doesn\'t exist, or it\'s false')

请注意,签入全局变量时需要字符串,但之后在检查value时使用实际变量。

关于变量存在的更多信息: 如何检查变量是否存在?

其他回答

下面是一个函数,它将返回第一个非None的参数:

def coalesce(*arg):
  return reduce(lambda x, y: x if x is not None else y, arg)

# Prints "banana"
print coalesce(None, "banana", "phone", None)

reduce()可能不必要地遍历所有参数,即使第一个参数不是None,所以你也可以使用这个版本:

def coalesce(*arg):
  for el in arg:
    if el is not None:
      return el
  return None
other = s or "some default value"

好的,必须阐明or运算符是如何工作的。它是一个布尔运算符,所以它在布尔上下文中工作。如果值不是布尔值,则为运算符的目的将它们转换为布尔值。

注意,or操作符不仅返回True或False。相反,如果第一个操作数为真,它返回第一个操作数,如果第一个操作数为假,它返回第二个操作数。

在这种情况下,表达式x或y如果为True或在转换为布尔值时求值为True则返回x。否则返回y。在大多数情况下,这将与C #空并运算符的目的完全相同,但请记住:

42    or "something"    # returns 42
0     or "something"    # returns "something"
None  or "something"    # returns "something"
False or "something"    # returns "something"
""    or "something"    # returns "something"

如果你使用变量s来保存对类实例的引用或None(只要你的类没有定义成员__nonzero__()和__len__()),使用与空合并操作符相同的语义是安全的。

事实上,Python的这种副作用甚至可能是有用的。由于您知道哪些值的值为false,因此可以使用它来触发默认值,而无需专门使用None(例如,一个错误对象)。

在某些语言中,这种行为被称为Elvis操作符。

对于那些像我一样跌跌撞撞地在这里寻找一个可行的解决方案,当变量可能是未定义的,我得到的最接近的是:

if 'variablename' in globals() and ((variablename or False) == True):
  print('variable exists and it\'s true')
else:
  print('variable doesn\'t exist, or it\'s false')

请注意,签入全局变量时需要字符串,但之后在检查value时使用实际变量。

关于变量存在的更多信息: 如何检查变量是否存在?

除了单个值的@Bothwells answer(我更喜欢这个),为了检查函数返回值的空值分配,你可以使用new walrus-operator(自python3.8以来):

def test():
    return

a = 2 if (x:= test()) is None else x

因此,测试函数不需要计算两次(如果test()为None else test(),则a = 2)

Python has a get function that its very useful to return a value of an existent key, if the key exist;
if not it will return a default value.

def main():
    names = ['Jack','Maria','Betsy','James','Jack']
    names_repeated = dict()
    default_value = 0

    for find_name in names:
        names_repeated[find_name] = names_repeated.get(find_name, default_value) + 1

如果你在字典中找不到这个名字,它会返回default_value, 如果名称存在,则将任何现有值加1。

希望这能有所帮助