variable is local and global

K

Kyle Root

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
 
S

Skip Montanaro

Kyle> bash-2.05b$ ./version.py
Kyle> File "./version.py", line 11
Kyle> def make_acceptable(version):
Kyle> SyntaxError: name 'version' is local and global

Change either the name of the global variable or the name of the parameter.
They can't both be named "version".

Skip
 
P

Phil Frost

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top