code review
Chris Angelico
rosuav at gmail.com
Sat Jun 30 19:25:30 EDT 2012
On Sun, Jul 1, 2012 at 8:05 AM, Thomas Jollans <t at jollybox.de> wrote:
> Yes. My sole point, really, is that "normally", one would expect these
> two expressions to be equivalent:
>
> a < b < c
> (a < b) < c
>
> This is clearly not true.
Python has quite a few things like that, actually. The most noticeable
for C programmers is:
a = b = c = d = e = 0
which in C is identical to
a = (b = (c = (d = (e = 0))))
because assignment is an expression, but in Python is equivalent to
nothing because assignment is simply allowed to do multiple. Downside:
*Only* simple assignment can be chained. Augmented assignment cannot:
>>> a+=10 # That's fine.
>>> a+=b+=10
File "<stdin>", line 1
a+=b+=10
^
SyntaxError: invalid syntax
>>> a=b+=10
File "<stdin>", line 1
a=b+=10
^
SyntaxError: invalid syntax
>>> a+=b=10
File "<stdin>", line 1
a+=b=10
^
SyntaxError: invalid syntax
In C, these are all well-defined and valid, and are evaluated
right-to-left, and do what you would expect. (And yes, it's handy at
times to do this sort of thing.)
So it's not a special case for the comparison operators; it's a more
general case that Python handles certain chains of operators as single
entities, rather than breaking everything down into "OPERAND OPERATOR
OPERAND" and evaluating one at a time. Is it better than/worse than C?
Not really. It's a design choice and we code within it. (My personal
preference is for the C style, as it makes for a more expressive
language with less mental glitching, but as I say, that's personal
preference.)
ChrisA
More information about the Python-list
mailing list