I'd say just the opposite. Variables are hard, in a way that you don't even notice as an experienced programmer, but when we write
x = 1
x = 2
that's immediately very confusing for a beginner - are we saying that 1=2?
If we stick to immutable values and recursion, and functions that are, well, functions, we get something that corresponds quite closely to first-year mathematics, which makes it easy to learn at the same time.
Most Python material that I've seen that is an intro course makes limited use of changing variable [1] values , being written in a mostly-functional style (generally, preferring, at least initially, recursion to iteration to achieve that -- even though recursion is generally the wrong approach in production Python code.)
Using a modern imperative language doesn't prevent you from adding complexity a bit at a time, and -- especially initially -- getting the advantages of teaching things in a functional style.
[1] but not object fields, as objects are taught as containers of mutable state, usually late in the course.
> preferring, at least initially, recursion to iteration to achieve that -- even though recursion is generally the wrong approach in production Python code
Exactly! Intro courses are usually - with good reason - taught in functional style. Which suggests that a language where that style is more natural and appropriate might be a better fit for those courses than Python.
(Though OTOH I wouldn't advocate a language where IO is anything more complex than a function call)
that's assignment AND reassignment. Mutable state is fundamental to how computers work no matter how hard the fans of the current fad of functional programming try to deny it.
If we stick to immutable values and recursion, and functions that are, well, functions, we get something that corresponds quite closely to first-year mathematics, which makes it easy to learn at the same time.