[Tutor] Global variables

Luke Paireepinart rabidpoobear at gmail.com
Tue Aug 15 02:18:34 CEST 2006


Kermit Rose wrote:
>  
>  
> From: Alan Gauld 
> Date: 08/14/06 18:42:41 
> To: Kermit Rose; Luke Paireepinart 
> Cc: tutor at python.org; Danny Yoo 
> Subject: Re: [Tutor] Global variables 
>  
>  
> That may be true but you will make your code much less reusable 
> and much more error propne in the process. There are good reasons 
> why global variables are considered evil... 
>  
>  
> *****
>  
> I know that global variable usage can be abused.
>  
> But in fact I use the same variable names  in the subroutine parameter list
> as in the calling routine for every function in the module.
>  
> So I believe that in this case global variables would be useful and not
> likely to
> increase errors due to confusion of global and local variables.
>  
> I would never have a local variable with the same name as the global
> variable.
>  
>   
It sounds like you should make a Factoring class and have whichever
variables are similar for all functions be variables specific to the 
class instance
(I forgot the word for this)

Something like:

#----
Class Factoring(object):
    def __init__(self):
       self.var1 = ['a','b','c']
       self.var2 = 5
       self.var3 = (0)

    def method1(self):
       print self.var1,self.var2
    def method2(self):
       print self.var2,self.var3

fac = Factoring()
fac.method1()
fac.method2()

#-----
the output would be
['a','b','c']5
5(0)

Thus you prevent global namespace pollution.
> But in this case, it's only because of an apparent bug in Python that want
> to 
> bypass that I'm considering the use of global variables.
>   
You probably shouldn't claim there's a bug in Python unless you're sure 
(I.E. have a snippet of code
that reproduces the bug that you'll share with us)
>  
>  
> My routine strongfac calculates a value for fac in the subroutine, and the
> calling routine picks up a different vaalue.
>   
do you think you could use more conventional terminology like 'function' 
and such?
I don't understand what you mean by the subroutine of the routine.
def routine():
    def subroutine():
       print 'hi'
    subroutine()

Is that what you mean?
or by 'subroutine' do you mean 'loop inside of function'?

By your terminology, if there's a routine that calls strongfac, doesn't 
that mean
strongfac is a subroutine?  which would mean that the value for fac is 
calculated in the subroutine of the subroutine of the calling routine?

>  
> An illustration.
>  
> In strong fac:
>  
> fac = [1,2,3]
> print fac
> return fac
>  
> in fermat:
>  
> fac = strongfac(z)
> print fac
>  
> prints [0,0,0]
>   
what is 'z'?  a random parameter?
can you give us a cut-down version of your code that just reproduces this
erratic behavior you're having a problem with?

>  
> And most of the time it does not misbehave like this.
>   
if random.randint(0,5) < 3:
    malfunction()
>  
> It is only occasionally, and consistently with certain numbers to be
> factored.
>   
so with certain numbers it always occurs, with other numbers it 
sometimes occurs?
>  
>  
> Kermit   <  kermit at polaris.net >
>  
>   
Luke


More information about the Tutor mailing list