From: fuglyducky on
I am a complete newbie to Python (and programming in general) and I
have no idea what I'm missing. Below is a script that I am trying to
work with and I cannot get it to work. When I call the final print
function, nothing prints. However, if I print within the individual
functions, I get the appropriate printout.

Am I missing something??? Thanks in advance!!!!

################################################
# Global variable
sample_string = ""

def gen_header(sample_string):
HEADER = """
mymultilinestringhere
"""

sample_string += HEADER
return sample_string

def gen_nia(sample_string):
NIA = """
anothermultilinestringhere
"""

sample_string += NIA
return sample_string


gen_header(sample_string)
gen_nia(sample_string)

print(sample_string)
From: Michael Torrie on
On 08/11/2010 10:07 AM, fuglyducky wrote:
> I am a complete newbie to Python (and programming in general) and I
> have no idea what I'm missing. Below is a script that I am trying to
> work with and I cannot get it to work. When I call the final print
> function, nothing prints. However, if I print within the individual
> functions, I get the appropriate printout.
>
> Am I missing something??? Thanks in advance!!!!

Yes. You are passing sample_string into the functions, but not doing
anything with the return value.

> def gen_header(sample_string):
^^^^^^^^^^^^^^^
The sample_string name is rebound to the parameter now, completely
hiding the global variable, if that's really what you wanted.

> def gen_nia(sample_string):
^^^^^^^^^^^^^^^^^^^
Again.

> NIA = """
> anothermultilinestringhere
> """
>
> sample_string += NIA
> return sample_string
>
>
> gen_header(sample_string)
> gen_nia(sample_string)

Try this:

sample_string = gen_header(sample_string)
sample_string = gen_nia(sample_string)

You could drop the arguments to your functions and use the "global"
keyword to get access to sample_string from within the functions, but
normally that's a bad idea.
From: Pinku Surana on
On Aug 11, 12:07 pm, fuglyducky <fuglydu...(a)gmail.com> wrote:
> I am a complete newbie to Python (and programming in general) and I
> have no idea what I'm missing. Below is a script that I am trying to
> work with and I cannot get it to work. When I call the final print
> function, nothing prints. However, if I print within the individual
> functions, I get the appropriate printout.
>
> Am I missing something??? Thanks in advance!!!!
>
> ################################################
> # Global variable
> sample_string = ""
>
> def gen_header(sample_string):
>     HEADER = """
>     mymultilinestringhere
>     """
>
>     sample_string += HEADER
>     return sample_string
>
> def gen_nia(sample_string):
>     NIA = """
>     anothermultilinestringhere
>     """
>
>     sample_string += NIA
>     return sample_string
>
> gen_header(sample_string)
> gen_nia(sample_string)
>
> print(sample_string)

There are 2 problems with your program.

(1) If you want to use a global variable in a function, you have to
add the line "global sample_string" to the beginning of that
function.

(2) Once you do (1), you will get an error because you've got
sample_string as a global and a function parameter. Which one do you
want to use in the function? You should change the name of the
parameter to "sample" to solve that confusion.

Here's the result, which works for me:

sample_string = ""
def gen_header(sample):
global sample_string
HEADER = """
mymultilinestringhere
"""
sample_string = sample + HEADER
return sample_string
def gen_nia(sample):
global sample_string
NIA = """
anothermultilinestringhere
"""
sample_string = sample + NIA
return sample_string
gen_header(sample_string)
gen_nia(sample_string)
print(sample_string)
From: Robert Kern on
On 8/11/10 11:07 AM, fuglyducky wrote:
> I am a complete newbie to Python (and programming in general) and I
> have no idea what I'm missing. Below is a script that I am trying to
> work with and I cannot get it to work. When I call the final print
> function, nothing prints. However, if I print within the individual
> functions, I get the appropriate printout.
>
> Am I missing something??? Thanks in advance!!!!
>
> ################################################
> # Global variable
> sample_string = ""
>
> def gen_header(sample_string):
> HEADER = """
> mymultilinestringhere
> """
>
> sample_string += HEADER
> return sample_string

By default, all assignments inside of a function are local to the function. Even
augmented assignments like +=. Python strings are immutable, so

sample_string += HEADER

works exactly like

sample_string = sample_string + HEADER

The string referred to by the global name sample_string is never modified and
the global name is never reassigned.

http://docs.python.org/py3k/tutorial/classes.html#python-scopes-and-namespaces

> gen_header(sample_string)
> gen_nia(sample_string)
>
> print(sample_string)

You probably want something like the following:

sample_string = gen_header(sample_string)
sample_string = gen_nia(sample_string)

print(sample_string)

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco

From: EW on
This will work:
------------------------------------------------------------------------
sample_string=""

def gen_header(sample_string=""):
HEADER = """
mymultilinestringhere
"""

sample_string+= HEADER
return sample_string

def gen_nia(sample_string=""):

NIA = """
anothermultilinestringhere
"""
sample_string += NIA
return sample_string

sample_string = gen_header(sample_string)
sample_string = gen_nia(sample_string)
print(sample_string)

------------------------------------------------------------------------
and this will work
------------------------------------------------------------------------

sample_string=""

def gen_header(OtherString):
global sample_string
HEADER = """
mymultilinestringhere
"""

sample_string+= HEADER


def gen_nia(OtherString):
global sample_string
NIA = """
anothermultilinestringhere
"""
sample_string += NIA


gen_header(sample_string)
gen_nia(sample_string)
print(sample_string)

------------------------------------------------------------------------


The first one is the better of the 2 in this example but the second
one will show you how to use global variables if you really need to
use them

So your problem was that you thought you were working on a global
variable in your functions when you were not. Since the your def
lines contained sample_string that make it a local variable. So when
you were doing your += statements you were working on a local variable
and not a global variable. You were returning the value of the local
variable but you didn't have anything in the main body of your script
catching that value. So simply changing these 2 lines:
sample_string = gen_header(sample_string)
sample_string = gen_nia(sample_string)

made the global sample_string variable store the values of the return
data.


If you want to use global variables then you just have to do 2
things. First you have to make sure you don't have any local
variables it the function with the same name. So I change the name to
OtherString in the def line. Then you need a global statement at the
start of your function (global sample_string) that tells python that
you really do want to use that global variable.

Global variables can cause you no end of heartache so python forces
you to explicitly state that you want to use them.

Hope that helps.