variable is local and global

Phil Frost indigo at bitglue.com
Sun Jul 25 22:51:26 EDT 2004


In the function make_acceptable, 'version' is both local and global
because it's a parameter, and you have used global to make it global.
Python does not allow it because what you mean by 'version' is
ambigious; it could mean the local, or the global. Rename either the
parameter or the global and it will work. Better yet, restructure your
code so that you don't need a global; either use the return value, or
make a class. Globals are never a good idea unless the cost of writing
it again is less than the cost of writing it right the first time.

On Mon, Jul 26, 2004 at 02:41:33AM +0000, Kyle Root wrote:
> I'm writing a little program that compares two versions and tells you 
> whether you are upgrading, downgrading, or it's the same version. 
> Unfortunately, I haven't gotten very far, in fact I'm at a dead stop.
> 
> I need to make a variable in function available outside the function, so 
> I used "global", however now the program won't run and gives me the not 
> so friendly error:
> 
> bash-2.05b$ ./version.py
>   File "./version.py", line 11
>     def make_acceptable(version):
> SyntaxError: name 'version' is local and global
> 
> -------------------------
> 
> I've looked and searched all over. Here's the code in case anyone can 
> spot the problem.
> 
> -------------------------
> #!/usr/bin/python
> import string
> import sys
> # This'll be replaced by an arg catching function, but for now this will 
> be fine
> db_version="2.6.0"
> pkg_version="2.6.6"
> # We don't allow versions that have anything else besides digits and periods
> acceptable_chars = "1234567890."
> max_count = len(pkg_version)-1
> def make_acceptable(version):
> 	counter = 0
> 	while 1 == 1:
> 		one_char = version[(counter):(counter + 1)]
> 		if one_char in acceptable_chars:
> 			if counter == max_count:
> 				# Now we need to replace the periods with 
> 				zeros.
> 				version = version.replace(".","0")
> 				global version
> 				break
> 			elif counter != max_count:
> 				counter = counter + 1
> 		elif one_char not in acceptable_chars:
> 			print "EXITING: Versions may only contain digits and 
> 			periods"
> 			sys.exit()
> 
> make_acceptable(db_version)
> db_version = version
> print db_version
> make_acceptable(pkg_version)
> pkg_version = version
> print pkg_version
> -----------------------
> Thanks:
> 	Kyle ;)



More information about the Python-list mailing list