Newbie help- Can multiple instances with multiple names automatically created.
Steven D'Aprano
steven at REMOVE.THIS.cybersource.com.au
Mon Jan 4 22:52:02 EST 2010
On Mon, 04 Jan 2010 19:12:53 -0800, Nav wrote:
> Okay, let me ask another question:
>
> When we create instances of objects by doing
> x = className()
> are we using globalnamespace?
That depends on whether you are doing x = className() inside a function
(or class), or in the top level of the program.
If I do this:
x = 1234
def function():
y = 4567
then x is defined in the global namespace and y is defined in the
namespace which is local to function().
> if yes then:
> if using globalnamespace is bad then why does every book or tutorial
> about python classes give the above style of assignment as an example?
No, you're confused -- the problem isn't with using the global namespace.
The problem is that you don't know what names you want to use ahead of
time.
You use assignment like:
x = something()
when you know the name x when you are writing the code. That way you can
write x in the code, and all is good:
x = something()
print x.method()
mydict = {x: -1}
assert mydict.keys() == [x]
Now, imagine that you didn't know what names you have to use. Say, for
example, that you need a variable number of Somethings:
a = Something()
b = Something()
c = Something()
d = Something()
# I never know when to stop...
z = Something()
# ... keep going? too far? who knows??? HELP!
process(a)
process(b)
process(c)
# when do I stop???
process(x)
process(y) # ...
That's the wrong way to deal with it. So instead you use a list:
mylist = [] # define ONE NAME in the global namespace
for i in range(some_number):
mylist.append(Something())
# later...
for x in mylist: # again, we use ONE name, `x`
process(x)
A list implicitly maps numbers (the position) to values. If you want to
map strings (names) to values, use a dict. Here is an example. Notice we
don't know how many players there are, or what their names are:
print "Welcome to the game."
print "Please enter the name of each player,"
print "or the word 'STOP' when there are no more players."
players = {}
i = 1
while True:
# loop forever
name = raw_input("Name of player %d? " % i)
name = name.strip() # get rid of extra whitespace
if name.upper() == 'STOP':
# we're done
break
players[name] = NewPlayer()
# much later...
for name, player in players.items():
print "Welcome, player %s" % name
play_game(player)
The only downside is that dicts are unordered, so the order of the
players is not the same as the order they were entered in.
--
Steven
More information about the Python-list
mailing list