473,320 Members | 1,916 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,320 software developers and data experts.

Problem with global variables

I'm having a vexing problem with global variables in Python. Please
consider the following Python code:

#! /usr/bin/env python

def tiny():
bar = []
for tmp in foo:
bar.append(tmp)
foo = bar

if __name__ == "__main__":
foo = ['hello', 'world']
tiny()

When I try to run this, I get:

Traceback (most recent call last):
File "./xtalk.py", line 11, in ?
tiny()
File "./xtalk.py", line 5, in tiny
for tmp in foo:
UnboundLocalError: local variable 'foo' referenced before assignment

For some reason, Python can't see the global variable "foo" in the
function tiny(). Why is that?

If I change the code to this:

#! /usr/bin/env python

def tiny():
for tmp in foo:
print tmp

if __name__ == "__main__":
foo = ['hello', 'world']
tiny()

I get this:

hello
world

All of a sudden, tiny() can see the global variable "foo". Very
confusing! Why is it that tiny() sometimes can, and sometimes can't,
see the global variable "foo"?

If anyone can enlighten me about what's going on with Python and
global variables, I would appreciate it!
Apr 2 '07 #1
9 2965
hg
Ed Jensen wrote:
#! /usr/bin/env python

def tiny():
bar = []
for tmp in foo:
bar.append(tmp)
foo = bar

if __name__ == "__main__":
foo = ['hello', 'world']
tiny()

Like this ?

#! /usr/bin/env python

def tiny():
* * bar = []
gobal foo
* * for tmp in foo:
* * * * bar.append(tmp)
* * foo = bar

if __name__ == "__main__":
* * foo = ['hello', 'world']
* * tiny()
hg

Apr 2 '07 #2
Ed Jensen a écrit :
I'm having a vexing problem with global variables in Python. Please
consider the following Python code:

#! /usr/bin/env python

def tiny():
bar = []
for tmp in foo:
bar.append(tmp)
foo = bar

if __name__ == "__main__":
foo = ['hello', 'world']
tiny()

When I try to run this, I get:

Traceback (most recent call last):
File "./xtalk.py", line 11, in ?
tiny()
File "./xtalk.py", line 5, in tiny
for tmp in foo:
UnboundLocalError: local variable 'foo' referenced before assignment

For some reason, Python can't see the global variable "foo" in the
function tiny(). Why is that?

If I change the code to this:

#! /usr/bin/env python

def tiny():
for tmp in foo:
print tmp

if __name__ == "__main__":
foo = ['hello', 'world']
tiny()

I get this:

hello
world

All of a sudden, tiny() can see the global variable "foo". Very
confusing! Why is it that tiny() sometimes can, and sometimes can't,
see the global variable "foo"?

If anyone can enlighten me about what's going on with Python and
global variables, I would appreciate it!
To complete hg reply, Python compile your tiny function which contains a
foo assignment. As foo is not defined "global", it is considered to be
local. So the error when you tries to iterate throught foo before
assigning it. And so the solution to add "global foo" before using it.

A+

Laurent.
Apr 2 '07 #3
Laurent Pointal wrote:
And so the solution to add "global foo" before using it.
Didn't you read his final question?

| All of a sudden, tiny() can see the global variable "foo". Very
| confusing! Why is it that tiny() sometimes can, and sometimes
| can't, see the global variable "foo"?

I have no explanation for this, but I'm interested in one, too.

Regards,
Björn

--
BOFH excuse #422:

Someone else stole your IP address, call the Internet detectives!

Apr 2 '07 #4
Bjoern Schliessmann wrote:
Laurent Pointal wrote:
>And so the solution to add "global foo" before using it.

Didn't you read his final question?

| All of a sudden, tiny() can see the global variable "foo". Very
| confusing! Why is it that tiny() sometimes can, and sometimes
| can't, see the global variable "foo"?

I have no explanation for this, but I'm interested in one, too.
It doesn't happen "all of a sudden", it happens when the assignment to
foo is removed from the function definition. The interpreter therefore
no longer regards foo as a local variable.

regards
Steve
--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
Recent Ramblings http://holdenweb.blogspot.com

Apr 2 '07 #5
Bjoern Schliessmann schreef:
Laurent Pointal wrote:
>And so the solution to add "global foo" before using it.

Didn't you read his final question?

| All of a sudden, tiny() can see the global variable "foo". Very
| confusing! Why is it that tiny() sometimes can, and sometimes
| can't, see the global variable "foo"?

I have no explanation for this, but I'm interested in one, too.
Within functions Python can read from global variables, even without a
'global' statement. Complications only arise when you try to write to
it: in that case Python assumes it is a local variable instead of a global.

It surprised me a bit when I first found out about this: I would have
thought that Python would threat it as a local throughout the function
until the function assigns something to it. That's not what happens: if
the function assigns to it, *all* mentions of the variable are
considered local.

--
If I have been able to see further, it was only because I stood
on the shoulders of giants. -- Isaac Newton

Roel Schroeven
Apr 2 '07 #6
On Apr 2, 5:29 pm, Bjoern Schliessmann <usenet-
mail-0306.20.chr0n...@spamgourmet.comwrote:
Laurent Pointal wrote:
And so the solution to add "global foo" before using it.

Didn't you read his final question?

| All of a sudden, tiny() can see the global variable "foo". Very
| confusing! Why is it that tiny() sometimes can, and sometimes
| can't, see the global variable "foo"?

I have no explanation for this, but I'm interested in one, too.

Regards,

Björn
Laurent Pointal did explain this. "foo" is considered to be a local
variable (scope limited to the function) if it's being assigned to in
a function and there's no "global foo" statement. So even the "foo"
before the actual assignment will refer to the local variable. But the
local variable hasn't been assigned yet at that point and an exception
is thrown. Yes, one could have a perfectly working function, then add
an innocent-looking assignment statement at the very end of the
function, and suddenly you'd get an exception thrown at the beginning
of the function where that variable is used - Far away from the place
where the modification was made.

Why does it work like this? Couldn't it be somehow more uniform or
less surprising?

Well, if one had to define "global foo" even when one were to just
read the variable foo, that'd be a pain in the ass. You'd have to use
"global math" to use math module in a function and "global
anotherFunction" to call anotherFunction, and so on. There's plenty of
stuff in the global scope that you don't normally assign to.

Another option would be to scrap "global" keyword and let "foo = bar"
do an assignment to the global variable if a global variable named
"foo" exists, but create (or assign) to a function local variable if
it doesn't exist. That'd work but programming would be horrible. Now
you'd have to know all the symbols that exist at the global scope,
because if you accidentally accessed a global variable instead of
local, your function would probably have undesirable side-effects.

Now, name clashes could be solved with a naming convention (which
could be enforced at the language level). It could be possible that
all accesses to global scope would have to be prefixed by some symbol
like $. E.g. "$foo = 4; foo = 6" where former assigns to global foo,
latter to local foo. That's one option that might work and be somewhat
readable.. But not a good tradeoff IMO, considering how rarely global
assignment is needed and how often global variables are read.

A remaining option is to use different operator for assignment and
initialization. So you'd have to do e.g. "a := 4; a = 7". I'm not sure
Pythonistas would prefer this either, although many other languages
choose this route (through lets or declarations typically).

Apr 2 '07 #7
Ed Jensen <ej*****@visi.comwrote:
I'm having a vexing problem with global variables in Python.
<SNIP>

Thanks to everyone who replied. The peculiar way Python handles
global variables in functions now makes sense to me.
Apr 2 '07 #8
Bjoern Schliessmann wrote:
Laurent Pointal wrote:
>And so the solution to add "global foo" before using it.

Didn't you read his final question?
Yes, and i replies: "which contains a foo assignment. As foo is not
defined "global", it is considered to be local. "

Maybe my explanation was not clear enough with variable foo to be considered
local because there is an *assignment* to foo.

A+

Laurent.
Apr 2 '07 #9
Laurent Pointal wrote:
Yes, and i replies: "which contains a foo assignment. As foo is
not defined "global", it is considered to be local. "

Maybe my explanation was not clear enough with variable foo to be
considered local because there is an *assignment* to foo.
Yep, thanks for the clarification. After four replies and despite
weird conjugations, I've definitely got it now ... ;)

Regards,
Björn

--
BOFH excuse #113:

Root nameservers are out of sync

Apr 2 '07 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Gary | last post by:
I am having a strange problem that I cannot solve. I have an asp page that I use for a user to login and gain access to other pages. When the user logs in I set a couple of session variables like...
10
by: Matt | last post by:
Greetings, What are people's thoughts on global variables in C++? Why are we taught not to use them in programming? Is it true that if you are running two copies of the C program one copy can...
4
by: Andrew V. Romero | last post by:
I have been working on a function which makes it easier for me to pull variables from the URL. So far I have: <script language="JavaScript"> var variablesInUrl; var vArray = new Array(); ...
2
by: Anand Subramanian | last post by:
Hi, Can someone explain the differences(setup, pre-main() setup/initialization) between global variables in a C++ and a C program? The global variables I used are uninitialized. I have a test.o...
2
by: Bryan Parkoff | last post by:
….I would like to know which is the best optimization to use global variable or global struct. I always tell C/C++ Compiler to turn on optimization. ….I use underscore between first name and...
2
by: ajikoe | last post by:
Hi, I tried to follow the example in swig homepage. I found error which I don't understand. I use bcc32, I already include directory where my python.h exist in bcc32.cfg. /* File : example.c...
4
by: Harry | last post by:
Good Day, I am writing a code for the H.264 Video codec.I am using VC++ compiler,but programming is in c only.I have grouped the related global variables under one structure in a header file...
2
by: sorobor | last post by:
dear sir .. i am using cakephp freamwork ..By the way i m begener in php and javascript .. My probs r bellow I made a javascript calender ..there is a close button ..when i press close button...
3
by: =?Utf-8?B?dGhlamFja29mYWxs?= | last post by:
I have a few global variables and a function that gets called multiple times to complete a single transaction and uses the variables. The function gets different notifications. When the function...
2
by: Anthony Kuhlman | last post by:
Pythoners, I'm having trouble understanding the behavior of global variables in a code I'm writing. I have a file, test.py, with the following contents foo = def goo(): global foo foo = ...
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
0
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: Shællîpôpï 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: af34tf | last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.