这个构造的正式名称是什么?

问题描述:

在蟒蛇:这个构造的正式名称是什么?

>>> a = b or {} 
+0

您也可以在Ruby中看到这一点。 – 2010-02-24 08:10:23

+0

和Perl,如果我也记得正确 – 2010-02-24 08:11:36

+0

也在Javascript中。 – YOU 2010-02-24 08:12:51

我不认为它有一个正式名称,它只是一个聪明/懒惰的方式来简洁。这大致相当于:

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 {} 
+0

所以我们给他一个:) – 2010-02-24 08:07:18

+0

非常像var a = b ??在C#中新的b()。 – 2010-02-24 08:20:28

+1

@Filip:类似的,除了空合并运算符'??'被故意添加到C#用于该目的。 Python中的这个技巧是可行的,因为在布尔上下文中None被视为false。但0,[],{}等...也评估为假,所以要小心。如果你想模仿'''',最好是明确地写'is None'测试,而不是依赖这个技巧。 – 2010-02-24 08:29:00

这不是一个特殊的结构,至少我有些疲惫的眼睛。它的意思是分配结果

(b or {}) 

给a。

因此,如果b是一个False值,则得到{}(空字典文字),否则它将得到b的值。

+0

,但也许有一个名称。短路分配是我想说的那个。也许是条件分配?但通常是指?:操作符。 – 2010-02-24 08:06:29

+0

它并不是真的依赖于任何形式的短路,但是......如果它能够抑制RHS的某些副作用,我会这么做。但为此? – 2010-02-24 08:40:08

+0

如果你来自C++或Java,那么你可以在“或”的两边放置唯一的东西就是布尔值,这是一个“特殊构造”。在这里,b可以是任何对象(可能是基于上下文的字典),所以(b或{})是*不是*布尔值。对于Pythonista来说,这是完全正常的,但如果你是第一次学习Python,这并不明显。 – MatrixFrog 2010-02-24 09:33:27

默认分配成语

+1

官方或您在此刻发明的? – 2010-02-24 08:24:41

+1

@Stefano,我以为我们正在投票认为我们认为官方名称应该是:) – 2010-02-24 08:35:52

表达b or {}只是一个简单的boolean OR expression。关于这个特殊的仅仅是这种表达不需要定义每个返回一个布尔值,像其他语言:

表达x or y首先评估X;如果x为真,则返回其值;否则,评估并返回结果值。

(请注意,无论是and也不or限制值并键入他们回到FalseTrue,而是返回最后一个变量,这有时是有用的,例如,如果s是应该由一个默认的替换字符串如果它是空的,则表达式s or 'foo'产生期望的值。因为not必须发明一个值,所以它不费时返回与它的参数相同类型的值,所以例如not 'foo'产生False而不是''。)