Thanks for all the wonderful help, everyone!

On 10/29/11, Peter Otten <__pete...@web.de> wrote:
> Brian Stovall wrote:
>
>> Hello world!
>>
>> I obviously don't understand something important and basic, but I am
>> having trouble figuring it out myself... I am running python v3.2.2 on
>> a Win XP machine.
>>
>> My code:
>>
>> import card_model
>> import random
>>
>> class Pile:
>>     """An Object reperesenting a list of 'Card' Objects: could be a
>> hand, discard pile, tableau
>>     or anything really. Has a display_type that is used to clarify
>> what kind of display to use, and
>>     .deal(cards[] , new_pile(Pile Object)) and .shuffle() methods."""
>>
>>     DISPLAY_TYPES = ["STACK", "FAN", "ACCORDION", "CASCADE"]
>>
>>     def __init__(self, cards = [], display_type = "STACK"):
>
> That is a common pitfall: the default values of functions and methods are
> evaluated only once. Therefore all Pile instances created without an
> explicit cards argument
>
> p = Pile()
>
> end up sharing the same cards list. The idiomatic way to avoid that problem
> is a default value of None:
>
>     def __init__(self, cards=None, display_type="STACK"):
>         if cards is None:
>             cards = [] # no list provided -> make a new one
>         self.cards = cards
>         self.display_type = display_type
>
> Note that this problem can only occur with "mutable" types (types whose
> internal state can be modified at any time); the default for display_type is
> immutable (its state is set once and for all when the object is created) and
> thus cannot cause that kind of trouble.
>
>>         self.cards = cards
>>         self.display_type = display_type
>>
>>     def __str__(self):
>>         return_string = ""
>>         for i in self.cards:
>>             return_string = return_string + str(i) + "\n"
>
> Have a look at str.join(). Example:
>
> "\n".join(str(card) for card in self.cards)
>
>>         return_string = return_string + str(self.display_type)
>>         return return_string
>>
>>     def shuffle(self):
>>         random.shuffle(self.cards)
>>
>>     def add(self, card_list):
>>         for i in card_list:
>>             self.cards.append(i)
>
> Have a look at list.extend().
>
>>     def deal(self, number_of_cards, position = 0):
>>         """Deletes the number of cards out of the pile, starting from
>>         position (default is the top) and returns that list of cards, for
>>         communication with other piles' .add methods."""
>>
>>         dealt_list = []
>>         try:
>>             for i in range(number_of_cards):
>>                     dealt_list.append(self.cards[position])
>>                     del self.cards[position]
>
> Have a look at list.pop() or slices like
>
> cards[position:position+number_of_cards]
>
>>             return(dealt_list)
>>         except IndexError:
>>             print("Error, out of cards!")
>>
>>             return(None)
>>
>> I had been testing it with single objects favorably, but when I
>> instantiate two Pile objects, methods like .add or .shuffle affect all
>> of the Pile objects in memory. At first I thought the objects were all
>> initializing to the same space in memory, but it wasn't true. If you
>> need to see all my modules or my tester code, I will happily post.
>>
>> Thanks for helping a rank beginner!
>>
>> -Brian
>> _______________________________________________
>> Tutor maillist  -  Tutor@python.org
>> To unsubscribe or change subscription options:
>> http://mail.python.org/mailman/listinfo/tutor
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to