This snippet:
a = np.arange(12, 0, -1).reshape(3, 4)
(a := a.flatten()).sort()
print(a)
produces
[ 1 2 3 4 5 6 7 8 9 10 11 12]
as expected. Without named expression:
a = np.arange(12, 0, -1).reshape(3, 4)
a = a.flatten().sort()
print(a)
I'm getting None. Why is that?
CodePudding user response:
Quoting from 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:
So this code,
(a := a.flatten()).sort()
print(a)
is roughly equivalent to
a = a.flatten()
a.sort()
print(a)
This means that you are not assigning the result of sort anywhere. You are letting a.sort() to complete and print a later(which will result in expected output)
Remember sort is an in-place operation and it returns None, So in your second code you are assigning return value of sort(which is None).
a = a.flatten().sort()
CodePudding user response:
ndarray.sort performs sorting in-place without returning the value.
In your first example you create a, then assign the result of a.flatten() to it. After that the sort function executes sorting in-place on the array which a points to. Then you print a not result of sort().
In second example you print the result of sort which is None, instead of sorted array a.
