Anyone know the history of why strings are iterable?
I think every intermediate Python programmer has had to learn the gotcha that you can't really duck-type iterables, because if you accidentally iterate over a string, Python will chug along perfectly fine despite it almost certainly not being the intended behavior. Even worse, because of the way collections ABCs are defined, a typing check like `isinstance("a string", collections.abc.Collection)` will still return True despite it almost certainly not being what is intended.

My question is whether anyone knows *the history* of why this is the case. Given the direction that the language was moving in, I would've thought it'd be a prime candidate for removal in the 2-to-3 transition. Obviously, there are use cases for iterating along elements of a string, but with Python 3 strings being unicode-by-default, the rich standard library, and the general high-level nature of the language, I don't see much of a use case at all. Certainly, I don't think it's contentious to say the drawbacks of making it the default behavior outweigh the benefits, with any real use cases easily accommodated by more specific `str.characters` or `str.bytes` methods.

So, what gives? Has this issue ever been actively discussed in the development of the language? Is it just a case of a holdover from earlier languages that was never really a big enough deal to get challenged? And why was it made even more formal with the introduction of `collections.abc`? Google-ing hasn't really provided any strong answers, so any stories or nuggets of info greatly appreciated!

**edit:** Maybe should have made it more clear that the question is really why strings are *still* iterable by default. I understand the history of strings as character arrays, and don't have a hard time imagining how that naturally made it into the language. But why that is still the case in Python 3 given that:

* It is a gotcha new users frequently run into (just search for people asking how to properly handle a `str` vs a `[str]` in a function argument)
* It doesn't *really* fit with how we think about the datatypes in Python (I doubt many Python programmers day-to-day think of a `str` as "an ordered collection of `str` objects")
* The uses for iterable-by-default seem limited given the wide builtin and standard library functionality available for `str` objects.