I'm writing a simple class to represent a deck of cards. Here is the
stripped down version. Notice classes Deck and Deck2. Class Deck works,
Deck2 does not. My thinking is that it should be more efficient (a la
Deck2) to pre-create the list, and then modify it, rather than appending
Cards as in Deck.
# --------------------snip--------------
class Card:
def __init__(self, rank=0, suit=0):
self.rank=rank
self.suit=suit
def __repr__(self):
r = "A23456789TJQK"[self.rank]
s = "SHCD"[self.suit]
return r+s
class Deck:
def __init__(self):
self.deck = []
for r in range(13):
for s in range(4):
self.deck.append(Card(r,s))
class Deck2:
def __init__(self):
self.deck = 52 * [Card()]
n = 0
for r in range(13):
for s in range(4):
self.deck[n].rank = r
self.deck[n].suit = s
n = n + 1
a = Deck()
print "A --> ", a.deck
b = Deck2()
print "B --> ", b.deck
# ------------snap---------------------
Deck A looks right, 52 cards, one of each. Deck B, on the other hand, is
52 of the same card, all rank 12, suit 3.
What am I missing???
Thanks!
Nick. 5 1575
Nick wrote: class Deck2: def __init__(self): self.deck = 52 * [Card()]
Here you are creating a single Card instance and putting the same object
into a list 52 times. Each slot in the list points to the same object.
Another lesson to take away from this: Don't optimize prematurely. The
simplest implementation should be fine unless proven otherwise via
profiling.
--
Robert Kern rk***@ucsd.edu
"In the fields of hell where the grass grows high
Are the graves of dreams allowed to die."
-- Richard Harter
"Nick" <me*************@hotmail.com> wrote in message
news:41**********@alt.athenanews.com... I'm writing a simple class to represent a deck of cards. Here is the stripped down version. Notice classes Deck and Deck2. Class Deck works, Deck2 does not. My thinking is that it should be more efficient (a la Deck2) to pre-create the list, and then modify it, rather than appending
I strongly suspect premature optimization here.
Cards as in Deck.
# --------------------snip-------------- class Card: def __init__(self, rank=0, suit=0): self.rank=rank self.suit=suit
def __repr__(self): r = "A23456789TJQK"[self.rank] s = "SHCD"[self.suit] return r+s
class Deck: def __init__(self): self.deck = [] for r in range(13): for s in range(4): self.deck.append(Card(r,s))
class Deck2: def __init__(self): self.deck = 52 * [Card()]
This creates a list of 52 references to the card created by Card().
n = 0 for r in range(13): for s in range(4): self.deck[n].rank = r self.deck[n].suit = s n = n + 1
a = Deck() print "A --> ", a.deck b = Deck2() print "B --> ", b.deck # ------------snap---------------------
Deck A looks right, 52 cards, one of each. Deck B, on the other hand, is 52 of the same card, all rank 12, suit 3.
What am I missing???
Thanks! Nick.
How about a list comprehension?
class Deck3:
def __init__(self):
self.deck = [Card(r, s) for s in range(4) for s in range(13)]
Nick wrote: I'm writing a simple class to represent a deck of cards. Here is the stripped down version. Notice classes Deck and Deck2. Class Deck works, Deck2 does not. My thinking is that it should be more efficient (a la Deck2) to pre-create the list, and then modify it, rather than appending Cards as in Deck.
# --------------------snip-------------- class Card: def __init__(self, rank=0, suit=0): self.rank=rank self.suit=suit
def __repr__(self): r = "A23456789TJQK"[self.rank] s = "SHCD"[self.suit] return r+s
class Deck: def __init__(self): self.deck = [] for r in range(13): for s in range(4): self.deck.append(Card(r,s))
class Deck2: def __init__(self): self.deck = 52 * [Card()] n = 0 for r in range(13): for s in range(4): self.deck[n].rank = r self.deck[n].suit = s n = n + 1
a = Deck() print "A --> ", a.deck b = Deck2() print "B --> ", b.deck # ------------snap---------------------
Deck A looks right, 52 cards, one of each. Deck B, on the other hand, is 52 of the same card, all rank 12, suit 3.
What am I missing???
Thanks! Nick.
self.deck = 52 * [Card()]
Problem is with this line. It doesn't do what you want.
Try this from interpreter prompt:
class card:
pass
deck=52*[card()]
id(deck[0])
id(deck[1])
....
You will notice that all 52 entries in the list point
to the same instance of the card class.
As far as performance is concerned you are doing what
is commonly called as premature optimization. I set
up a loop and complete deck creation takes only 0.00015
seconds (that's 0.15 milliseconds) on my machine. I
wouldn't worry about optimizing this part of the program.
-Larry
Nick <me*************@hotmail.com> wrote:
... I'm writing a simple class to represent a deck of cards. Here is the stripped down version. Notice classes Deck and Deck2. Class Deck works, Deck2 does not. My thinking is that it should be more efficient (a la Deck2) to pre-create the list, and then modify it, rather than appending Cards as in Deck.
Everybody's accusing you of premature optimization, and they have a
point, but, there IS a very simple approach that's fast and useful
(particularly in Python 2.4 -- if you're interested in performance, get
and use 2.4 beta 1 *NOW*!!!-): a list comprehension:
self.deck = [Card(r, s) for r in xrange(13) for s in xrange(4)]
Alex
Nick wrote: I'm writing a simple class to represent a deck of cards. Here is the stripped down version. Notice classes Deck and Deck2. Class Deck works, Deck2 does not. My thinking is that it should be more efficient (a la Deck2) to pre-create the list, and then modify it, rather than appending Cards as in Deck.
Thanks for the replies... I smack my head in dismay. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Lefevre |
last post by:
Hello
I recently had troubles with a class inheritance hierarchy.
I solved it, but it didn't satisfied me.
I found the solution using this forum :)
Actualy i found the following message...
|
by: Amadrias |
last post by:
Hi all,
I am using a class to transport some data over the
network. I then added the attribute to the
class.
My problem is that this class is part of a framework and
that I do not want...
|
by: Nafai |
last post by:
Hello. I want to do something like this:
class A { // It's virtual
protected:
float* data;
int n;
public:
A(int a);
virtual float* createData();
//...
|
by: Martin Oddman |
last post by:
Hi,
I have a compiling problem. Please take a look at the code below.
I have an application that is built upon three tiers: one data tier
(Foo.DataManager), one business tier (Foo.Kernel) and...
|
by: Ben Blank |
last post by:
I'm writing a family of classes which all inherit most of their methods and
code (including constructors) from a single base class. When attempting to
instance one of the derived classes using...
|
by: TarheelsFan |
last post by:
What happens whenever you throw an exception from within a constructor?
Does the object just not get instantiated?
Thanks for replies.
|
by: Zytan |
last post by:
I have a struct constructor to initialize all of my private (or public
readonly) fields. There still exists the default constructor that sets
them all to zero. Is there a way to remove the...
|
by: clicwar |
last post by:
A simple program with operator overloading and copy constructor:
#include <iostream>
#include <string>
using namespace std;
class Vector {
private:
float x,y;
public:
Vector(float u, float...
|
by: JD |
last post by:
Hi,
My associate has written a copy constructor for a class. Now I need to add
an operator = to the class. Is there a way to do it without change her code
(copy constructor) at all? Your help...
|
by: Morten Lemvigh |
last post by:
Is it possible to pass a pointer to a constructor or a class definition
as argument to a function? Maybe in a way similar to passing function
pointers...?
The function should construct a number...
|
by: taylorcarr |
last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
|
by: aa123db |
last post by:
Variable and constants
Use var or let for variables and const fror constants.
Var foo ='bar';
Let foo ='bar';const baz ='bar';
Functions
function $name$ ($parameters$) {
}
...
|
by: ryjfgjl |
last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
|
by: ryjfgjl |
last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
| |