Getting into taste discussion, or any discussion perceived as such, is generally a waste of time, no matter how good the arguments.
Outside more general principles, my preferred practical reason to have assignment be an expression is to have a readable equivalent of a case statement when I want to match a string with several patterns (extracting sub-patterns), until one succeeds. Maybe someone has a nice solution which I did not see.
Anyway ... why not make everyone happy by making both worlds available by means of an interpretable comment at the beginning of the module file that states explicitly that assignments can be used as expression, if the programmer so desires?
People satisfied with the current situation will not see any change, and will still have their syntax errors detected in the same way.
And people who want to use assignment as expressions will simply have to say so.
I do not see that allowing to use assignments as expressions in an existing program that did not use it (by simply adding the suggested comment above) would change the semantics of that program.
Peace.
Post-sriptum -
This is added after the first five paragraphs of section 1 in the discussion below have been posted.
I do not know why Python designers made that choice. Avoidance of the
admittedly common error if a=b : ... instead of if a==b : ... is
hardly a justification.
First, it could quite easily be avoided with another notation for
assignment, such as := or <-, more appropriate since assignment
is not symmetrical, and used in some of the early ancestors of Python.
Second, the same problem is tolerated in another context. One can
write a = b=c while meaning actually to write a = b==c which is
quite different. And the error is not that visible when b and c
are large expressions. Furthermore, while it would probably be
detected as a type error if the language were statically typed, this
is not so in a dynamically typed language like Python (this is
actually true of = versus == in all contexts).
This tolerance is all the more surprising that multiple assignment of
the form a = b = c is hardly an essential feature of the language,
hardly a very useful feature.
It all looks like remnants of early design decisions, some motivated
by similarities with existing languages like C or Bash because Python
is also a scripting language, but has become much more than that. In
other words, it seems more accidental than well thought out design.
Hopefully, that is not what people have in mind when talking of
pythonicity.
This being said, these are minor syntactic restrictions, however annoying.
The language seems much better designed overall (with some mental restriction
regarding scope rules, until I make up my mind about its logic).
An interesting aspect of this discussion is that the prohibition of
assignment as expression (though it could be solved by a notation
change) is also made necessary by the absence of static typing.
But it is to be expected that absence of static typing, which is a
legitimate design choice, makes a lot of bugs harder to catch. This is
a very general observation. Nevertheless, this is the choice made by
Python designers. So be it.
But then they can hardly regret that confusion between equality and
assignment will be harder to catch. It is only a direct consequence,
one of many consequences of their design choice of more flexibility at
the expense of error detection. So error detection is a poor excuse
for this limitation on assignment.
Regarding the fact that an expression assignment would mix functionnal
and imperative style, this is a non-issue. The mixing is already
everywhere in the language.
Is there a written rationale for Python that document design choices in general, and the issue discussed here in particular ?