为什么在此 Numpy 函数链中需要命名表达式?

Why named expression is necessary in this Numpy function chain?

这段代码:

a = np.arange(12, 0, -1).reshape(3, 4)
(a := a.flatten()).sort()
print(a)

产生

[ 1  2  3  4  5  6  7  8  9 10 11 12]

符合预期。没有命名表达式:

a = np.arange(12, 0, -1).reshape(3, 4)
a = a.flatten().sort()
print(a)

我正在 None。这是为什么?

引用自PEP 572 – Assignment Expressions

Syntax and semantics

In most contexts where arbitrary Python expressions can be used, a named expression can appear. This is of the form NAME := expr where expr is any valid Python expression other than an unparenthesized tuple, and NAME is an identifier.

The value of such a named expression is the same as the incorporated expression, with the additional side-effect that the target is assigned that value:

所以这段代码,

(a := a.flatten()).sort()
print(a)

大致相当于

a = a.flatten()
a.sort()
print(a)

这意味着您没有在任何地方分配 sort 的结果。您正在让 a.sort() 完成并稍后打印 a(这将产生预期的输出)

记住 sort 是一个 in-place 操作并且它 returns None, 所以在你的第二个代码中你是分配 return 值 sort(即 None)。

a = a.flatten().sort()

ndarray.sort 执行排序 in-place 而不返回值。 在您的第一个示例中,您创建 a,然后将 a.flatten() 的结果分配给它。之后 sort 函数对 a 指向的数组执行排序 in-place。然后你打印 a 而不是 sort().

的结果

在第二个示例中,您打印 sort 的结果 None,而不是排序数组 a.