[Tutor] WAIDW - copying list within a recursive function
Lloyd Kvam
pythontutor at venix.com
Mon Sep 1 00:21:47 EDT 2003
This function will return a None if it ends though your failsafe else OR
if it ends through a non-zero i. It is not ending through the failsafe
branch since we do not see the printing of failsafe.
When the i==0 path returns the deck, it is returning it to the i==1
invocation of shuffle. That invocation does NOT have an explicit return,
so it returns None to the i == 2 invocation and so on.
The fix is:
....
if i > 0:
print "if i > 0"
shuffle(i-1, deck)
return deck
....
Ole Jensen wrote:
> WAIDW == (W)hat (A)m (I) (D)oing (W)rong
>
> (Question put short:
> Why does this function return; None?
> ###
> def shuffle(i=24, deck=[]):
> a = [ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, jack, queen, king]
> deck.append(a[:])
> print deck
> if i > 0:
> print "if i > 0"
> shuffle(i-1, deck)
> elif i == 0:
> print "elif i == 0"
> print deck
> return deck
> else: print "failsafe"
> ###
>
> Read below for more detailed describtion of my wrong doings ;)
> )
>
> I'm trying to create a list representing a stack of cards containing six
> card decks, I do not really care much of the about colour so my stack
> would come to look like this:
>
> ###
> stack = [[ace, 2, 3,....., king], [ace, 2, 3,....., king],........,[ace,
> 2, 3,...., king]
> ###
>
> The above should symbolise a list (stack) with 24 lists of different
> colours (allthough the colours e.g. clubs or hearts, are not shown as such).
>
> Now call me lazy but I would prefer not to type all those those
> identical lists manually (both easthatically and labour wise), so I saw
> this as a good time to try to play around with recursive functions
> (easily done in a forloop with two lines, but now I'm stubborn).
> The best bit of code I have come up with untill now is this:
>
> ###
> def shuffle(i=24, deck=[]):
> a = [ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, jack, queen, king]
> deck.append(a[:])
> print deck
> if i > 0:
> print "if i > 0"
> shuffle(i-1, deck)
> elif i == 0:
> print "elif i == 0"
> print deck
> return deck
> else: print "failsafe"
> ###
> (The print statements are for testing)
>
> Which of course doesn't work (Otherwise I wouldn't be writing this mail)!
> The the output ends up like this:
> [[11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]]
> if i > 0
> [[11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10], [11, 2, 3, 4, 5, 6, 7, 8,
> 9, 10, 10, 10, 10]]
> if i > 0
> etc. etc.
> These few lines above shows me that everything shaping about nicely, the
> list is looking the way it's supposed to.
>
> In the end of the output i finally equals 0, and the list is printed a
> final time looking complete (len(deck) == 24). When the next command in
> the sourcecode reads: return deck.
>
> ###
> elif i == 0:
> print "elif i == 0"
> print deck
> return deck
> ###
>
> My question is this:
> If the list "deck" is as it is supposed to (and it looks to be), then
> why does the function return; None?
>
> In advance thanks for any enlightment.
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Tutor maillist - Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
--
Lloyd Kvam
Venix Corp.
1 Court Street, Suite 378
Lebanon, NH 03766-1358
voice: 603-443-6155
fax: 801-459-9582
More information about the Tutor
mailing list