这个构造的正式名称是什么?
我不认为它有一个正式名称,它只是一个聪明/懒惰的方式来简洁。这大致相当于:
a = b if b else {}
或:
if b:
a = b
else:
a = {}
我写了这个作为一个评论,但我认为这是值得一提的:
你必须使用这一招时要非常小心。如果你的目的是当某个东西是None时设置一个默认值,那么明确地写这个is None
测试比使用这个技巧更好。原因是None不是唯一在布尔上下文中计算为false的东西。 0,[],{},...也评估为false。所以如果你没有考虑这些特殊情况,这个技巧可能不会给你预期的结果。
这里做到这一点是比较安全的一种方式:
a = b if b is not None else {}
所以我们给他一个:) – 2010-02-24 08:07:18
非常像var a = b ??在C#中新的b()。 – 2010-02-24 08:20:28
@Filip:类似的,除了空合并运算符'??'被故意添加到C#用于该目的。 Python中的这个技巧是可行的,因为在布尔上下文中None被视为false。但0,[],{}等...也评估为假,所以要小心。如果你想模仿'''',最好是明确地写'is None'测试,而不是依赖这个技巧。 – 2010-02-24 08:29:00
这不是一个特殊的结构,至少我有些疲惫的眼睛。它的意思是分配结果
(b or {})
给a。
因此,如果b是一个False值,则得到{}(空字典文字),否则它将得到b的值。
,但也许有一个名称。短路分配是我想说的那个。也许是条件分配?但通常是指?:操作符。 – 2010-02-24 08:06:29
它并不是真的依赖于任何形式的短路,但是......如果它能够抑制RHS的某些副作用,我会这么做。但为此? – 2010-02-24 08:40:08
如果你来自C++或Java,那么你可以在“或”的两边放置唯一的东西就是布尔值,这是一个“特殊构造”。在这里,b可以是任何对象(可能是基于上下文的字典),所以(b或{})是*不是*布尔值。对于Pythonista来说,这是完全正常的,但如果你是第一次学习Python,这并不明显。 – MatrixFrog 2010-02-24 09:33:27
默认分配成语
官方或您在此刻发明的? – 2010-02-24 08:24:41
@Stefano,我以为我们正在投票认为我们认为官方名称应该是:) – 2010-02-24 08:35:52
表达b or {}
只是一个简单的boolean OR expression。关于这个特殊的仅仅是这种表达不需要定义每个返回一个布尔值,像其他语言:
表达
x or y
首先评估X;如果x为真,则返回其值;否则,评估和并返回结果值。(请注意,无论是
and
也不or
限制值并键入他们回到False
和True
,而是返回最后一个变量,这有时是有用的,例如,如果s
是应该由一个默认的替换字符串如果它是空的,则表达式s or 'foo'
产生期望的值。因为not
必须发明一个值,所以它不费时返回与它的参数相同类型的值,所以例如not 'foo'
产生False
而不是''
。)
您也可以在Ruby中看到这一点。 – 2010-02-24 08:10:23
和Perl,如果我也记得正确 – 2010-02-24 08:11:36
也在Javascript中。 – YOU 2010-02-24 08:12:51