为什么在此 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
.
这段代码:
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
.