赋值表达式`:=`在Python中如何工作?

时间:2019-02-05 23:45:03

标签: python python-3.8

我已经读过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中使用:=分配变量将非常有用,因为将显示该值。


(更新: 我不鼓励就这个敏感的话题进行有目的的讨论。请避免发布有用的评论或答案。)

1 个答案:

答案 0 :(得分:5)

正如GreenCloakGuy所述,它是为了避免混淆,正如here所说,我认为这行总结了所有内容:

  

=和:=都没有语法位置。

由于太混乱,它还会使诸如此类的东西无效:

# Generate "num_points" random points in "dimension" that have uniform
# probability over the unit ball scaled by "radius" (length of points
# are in range [0, "radius"]).
def random_ball(num_points, dimension, radius=1):
    from numpy import random, linalg
    # First generate random directions by normalizing the length of a
    # vector of random-normal values (these distribute evenly on ball).
    random_directions = random.normal(size=(dimension,num_points))
    random_directions /= linalg.norm(random_directions, axis=0)
    # Second generate a random radius with probability proportional to
    # the surface area of a ball with a given radius.
    random_radii = random.random(num_points) ** (1/dimension)
    # Return the list of random (direction & length) points.
    return radius * (random_directions * random_radii).T