Note: The attached image is a screenshot of page 31 of Dr. Charles Severance’s book, Python for Everybody: Exploring Data Using Python 3 (2024-01-01 Revision).
I thought =
was a mathematical operator, not a logical operator; why does Python use
=
instead of ==
, or
<=
instead of <==
, or
!=
instead of !==
?
Thanks in advance for any clarification. I would have posted this in the help forums of FreeCodeCamp, but I wasn’t sure if this question was too…unspecified(?) for that domain.
Cheers!
=
and<
= match the mathematical operators. The question you want to ask is why doesn’t it use=
for equality, and the answer is that=
is already used for assignment (inherited from C among other languages).In theory a language could use
=
for assignment and equality but it might be a bit confusing and error prone. Maybe not though. Someone try it and report back.Rust does an interesting thing in this regard. It does still have
==
for checking if two values are equal, but well, it actually doesn’t have a traditional assignment operator. Instead, it has a unification operator, which programmers usually call “pattern matching”.And then you can use pattern matching for what’s effectively an assignment and to some degree also for equivalence comparison.
See a few examples here: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=1268682eb8642af925db9a499a6d587a
It’s all convention coming from older programming languages, particularly C, which comes from programmers wanting shorthand for things like “BRANCH_EQUAL $1 $2 $3” which is shorthand for some binary code.
Python has changed the logical and and or operators to be
and
andor
instead of&&
and||
.It would be confusing and weird if “=” did different things depending on the context.
= is the assignment operator
== is the comparison operator.
the others using = only is probably just to keep things short, and the fact that the context is a lot clearer with another character like < next to the =
Pascal uses
=
for comparison (and:=
for assignment), which confused the fuck out of me when I switched to C.Some people in mathematics use := to assign functions, like f(x) := x^2; then when evaluating the function you use f(2) = 4, because it can be ser as a “true” comparison
I’ve never seen that, even in university, and it would be equally as confusing without explanation.
I only remember two of my professors using it, and I has to ask the first one what that mean and explain to my classmates on the second one.
If I were to speculate, I’d say it came from the == operator (Boolean equality comparison) and then later, when that was extended to include Boolean less-than-or-equal and greater-than-or-equal, the decision was made to keep them 2 characters long. Either because it was visually cleaner, or just because programmers love being lazy (read: efficient)
It’s a convention set by early programming languages.
In most C-like languages,
if (a = b)...
is also a valid comparison. The=
(assignment) operation returns the assigned value as a result, which is then converted to a boolean value by theif
expression. Consider this Javascript code:let a = b = 1
- It first declares the
b
variable and assigns it the value of the expression1
, which is one. - It returns the result of the expression
b = 1
, which is the assigned value, which is1
. - It declares the
a
variable and assigns the previously returned value, which is1
.
Another example:
let a = 1 let b = 2 let c = 3 console.log(a == b) // prints "false" because the comparison is false console.log(a = b) // prints 2 because the expression returns the value of the assignment, which is 'b', which is 2 // Using this in an 'if' statement: if (b = c) { // the result of the assignment is 3, which is converted to a boolean true console.log("what") }
You can’t do the same in Python (it will fail with a syntax error), but it’s better to adhere to convention because it doesn’t hurt anyone, but going against it might confuse programmers who have greater experience with another language. Like I was when I switched from Pascal (which uses
=
for comparison and:=
for assignment) to C.With python you can use the := to assign and return new value.
Walrus operator my beloved
- It first declares the
It’s still a mathematic operator. There’s an entire field of math dedicated to comparisons, and it’s featured heavily in most programming languages. Computer science is a field dedicated to the application of math
<=
is already no mathematical assignment operator, but a comparison operator. Thus there is no need to define e.g.<==
for comparing two values.Pretty sure this is directly inspired by C so I would guess Guido van Rossum (the author of Python) just used what was already common back then. As in,
=
is assignment operator and==
is equality/comparison operator.https://en.cppreference.com/w/c/language/operator_comparison
I get your point of view, and haven’t thought about it that way before.
As for why it’s like that, my best guess is the sentence I wrote above. Your proposal totally makes sense.