# Newbi Q: What is a rational for strings not being lists in Python?

Dmitri O.Kondratiev dokondr at gmail.com
Mon Oct 15 17:05:36 CEST 2007

```To clarify my point:
reverse()  is  a lucky one  - Python has variants of *this particular*
function both for lists and strings. Yet what about other list functions?
How in general, can I write a function that works  both on list and string
types? Both are sequences, right? Why string is not a subtype of a list
then?
The advantage of string being a list of elements, where element is a char is
that all list functions will work *without any modifications* on strings as
well as on other types of lists.
So, I am trying to understand: what is a rational for strings not being
lists in Python?

Thanks,
--
Dmitri O. Kondratiev
dokondr at gmail.com
http://www.geocities.com/dkondr

On 10/15/07, Dmitri O.Kondratiev <dokondr at gmail.com> wrote:
>
> Gary, thanks for lots of info!
> Python strings are not lists! I got it now. That's a pity, I need two
> different functions: one to reverse a list and one to reverse a string:
>
> def reverseList(xs):
>     if xs == []:
>         return xs
>     else:
>         return (reverseList (xs[1:])) + [xs[0]]
>
> def reverseStr(str):
>     if str == "":
>         return str
>     else:
>         return (reverseStr (str[1:])) + str[0]
>
> Ok. Now regarding in-place reversal of a list:
>
> >>> l = [1,2,3]
> >>> l
> [1, 2, 3]
> >>> l.reverse()
> >>> l
> [3, 2, 1]
>
> That was, as I expected. Good.
>
> Then why this ? :
>
> >>> ls = [1,2,3].reverse()
> >>> ls
> >>>
> >>> print [1,2,3].reverse()
> None
> >>>
> I mean, why ls is empty after assignment?
>
> Also, I couldn't find in the Python docs what this form of slicing means:
> xs[::-1]  ?
>
> It works for creating a reversed copy of either a string or a list, but
> what does '::-1' syntax means?
>
> Thanks,
>
> Dmitri O. Kondratiev
> dokondr at gmail.com
> http://www.geocities.com/dkondr
>
> On 10/15/07, Gary Herron < gherron at islandtraining.com> wrote:
> >
> > Dmitri O.Kondratiev wrote:
> > >
> > > The function I wrote (below) reverses lists all right:
> > >
> > > def reverse(xs):
> > >     if xs == []:
> > >         return []
> > >     else:
> > >         return (reverse (xs[1:])) + [xs[0]]
> > >
> > >
> > > >>> reverse ([1,2,3])
> > > [3, 2, 1]
> > > >>>
> > >
> > >
> > > Yet when I try to reverse a string I  get:
> > >
> > > >>> reverse ("abc")
> > >
> > > ...
> > > ...
> > > ...
> > >
> > >   File "C:\wks\python-wks\reverse.py", line 5, in reverse
> > >
> > >     return (reverse (xs[1:])) + [xs[0]]
> > >
> > >   File "C:\wks\python-wks\reverse.py", line 5, in reverse
> > >
> > >     return (reverse (xs[1:])) + [xs[0]]
> > >
> > >   File "C:\wks\python-wks\reverse.py", line 2, in reverse
> > >
> > >     if xs == []:
> > >
> > > RuntimeError: maximum recursion depth exceeded in cmp
> > >
> > > >>>
> > >
> > > What's wrong? Why recursion never stops?
> > >
> > If you are doing this as an python-learning exercise, then read on.   If
> >
> > you are doing this reversal for real code, then try:
> >
> >   xs.reverse() for in-place reversal of a list (but not a string), or
> >   result = xs[::-1] for creating a reversed copy of either a string or a
> > list
> >
> >
> > Your recursion stops when xs == [], but when you're stripping characters
> > off a string,  like 'abc', the remaining portion will be 'bc', then 'c',
> > than '', but never [] so you 'll never stop.
> >
> > Try:
> >
> > if xs == []:
> >     return []
> > elif xs == '':
> >     return ''
> > else:
> >     ...
> >
> >
> > Gary Herron
> >
> >
> > >
> > > Thanks,
> > > Dima
> >
> >
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20071015/b1405bb0/attachment.html>
```