Bob Gailer said unto the world upon 2005-05-07 11:46: > At 07:43 AM 5/7/2005, Brian van den Broek wrote: > >> [EMAIL PROTECTED] said unto the world upon >> 2005-05-07 09:56: >> > Good morning, >> > >> > I came across a rather odd issue with scoping. Can someone explain why >> > testa and testc works, but not testb. I am running under python >> 2.4.1 on >> > Windows NT. >> > >> > thanks, >> > Michael >> >> <SNIP> >> >> > def testb(astr): >> > x = x - 1 >> > print astr, x >> >> `x =', with a function def, gets interpreted as "create a new name x >> in the function-local scope and bind it to whatever is on the right of >> the `='. But, on the right is an expression involving x itself. You >> might expect Python to look to the global scope to find x, but by >> writing `x =', you've already settled that x will be a local scope >> name, so it looks only in the local scope. Of, course, when it gets to >> `x -1', x hasn't yet been given a reference and it all barfs. > > > This is what the global statement is for: > > def testb(astr): > global x > x = x - 1 > etc. > > Bob Gailer
global will indeed fix that, yes. But, I've been lead to believe that one's first thought when tempted to write a global statement should be to reflect on whether that temptation isn't the symptom of a sub-optimal design. It certainly can (in my case has) lead to bugs when two separate bits of code both declare the same name global and thus each make their changes to it, after I have forgotten that I made both functions declare the name global. While nothing is guaranteed to protect me from myself :-) I have found I make fewer such mistakes when I either design my functions to explicitly take in the argument and return its modified value or instead employ a class and store the data as an instance attribute where the qualifier of self helps me to keep the issues straight. And, to engage in appeal to authority (almost the last refuge of the scoundrel): lots of Python programmers more accomplished than I seem to have the achieved a consensus that global is to be avoided. Best, Brian vdB _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor