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 -- http://mail.python.org/mailman/listinfo/python-list