13

我已经阅读了关于赋值表达式的PEP 572,我发现这段代码是一个清晰的例子,我可以在其中使用它:

while line := fp.readline():
    do_stuff(line)

但我很困惑,根据我的阅读,它应该像正常赋值一样工作,但返回值。但它似乎不像那样工作:

>>> w:=1
  File "<stdin>", line 1
    w:=1
     ^
SyntaxError: invalid syntax

现在在修补它之后,我意识到以下工作:

>>> (w:=1)
1

但这感觉太不合情理了。它是唯一需要括号的运算符:

>>> w = 1
>>> w + w
2
>>> w == w
True
>>> w is w
True
>>> w < w
False

解析器是否有理由将它与 Python 中的其他任何东西区别对待......?我觉得我错过了什么。这不仅仅是一个操作员。

在 REPL 中使用来分配变量会非常有用,:=因为值将被显示。


(更新:我不鼓励对这个敏感话题进行自以为是的讨论。请避免发表有用的评论或答案。)

4

1 回答 1

5

正如GreenCloakGuy提到的那样,它是为了避免混淆,正如这里所说,我认为这行总结了一切:

没有 = 和 := 都有效的句法位置。

它也使这些事情变得无效,因为太混乱了:

y0 = y1 := f(x)
foo(x = y := f(x))
于 2019-02-06T00:14:22.763 回答