UnboundLocalError - (code is short & simple)

P

pylearner

Python version = 2.6.1
IDLE
Computer = Win-XP, SP2 (current with all windows updates)

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

Greetings:

I have written code for two things: 1) simulate a coin toss, and 2)
assign the toss result to a winner. Code for the simulated coin toss
is in a file named "coin_toss.py." Code for the assignment of the
toss result is in a file named "toss_winner.py." Each file has one
simple function: 1) coin_toss(), and 2) toss_winner(), respectively.
The code for each file is listed below.

Problem:

I am getting an error when I run "toss_winner.py." The error message
is listed below.

Question #1:

Why am I getting this error?

Explanation:

As I understand it, the first statement of the toss_winner() function
body -- i.e. "coin_toss = coin_toss()" -- causes four things to
happen: 1) the coin_toss() function is called, 2) the coin_toss()
function is executed, 3) the coin_toss() function returns the value of
its local "coin_toss" variable, and 4) the returned value of the "coin
toss" variable that is local to the coin_toss() function is assigned
to the "coin toss" variable that is local to the toss_winner()
function.

Given this understanding, it seems I should NOT be getting a
"referenced before assignment" error, involving the "coin_toss" local
variable of "toss_winner()."

Note:

I am new to programming and Python. I'm currently self-studying
"Python Programming: An Intro to Computer Science" by Zelle.

Thanks!

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

Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
toss_winner()
File "C:/Python26/toss_winner.py", line 7, in toss_winner
coin_toss = coin_toss()
UnboundLocalError: local variable 'coin_toss' referenced before
assignment

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

# toss_winner.py

from coin_toss import coin_toss

def toss_winner():

coin_toss = coin_toss()

if coin_toss == "Heads":
toss_winner = "Player A"
print 'From "toss_winner" function >>',
print "Toss Winner = " + str(toss_winner)

else:
toss_winner = "Player B"
print 'From "toss_winner" function >>',
print "Toss Winner = " + str(toss_winner)

return toss_winner

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

# coin_toss.py

from random import random

def coin_toss():

random_number = random()

if random_number < .5:

coin_toss = "Heads"

print 'From "coin_toss" function >>',
print "Toss result = " + str(coin_toss)

else:

coin_toss = "Tails"

print 'From "coin_toss" function >>',
print "Toss result = " + str(coin_toss)

return coin_toss
 
C

Chris Rebert

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

Traceback (most recent call last):
 File "<pyshell#2>", line 1, in <module>
   toss_winner()
 File "C:/Python26/toss_winner.py", line 7, in toss_winner
   coin_toss = coin_toss()
UnboundLocalError: local variable 'coin_toss' referenced before
assignment

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

# toss_winner.py

from coin_toss import coin_toss

def toss_winner():

   coin_toss = coin_toss()

When Python sees this assignment to coin_toss as it compiles the
toss_winner() function, it marks coin_toss as a local variable and
will not consult global scope when looking it up at runtime (this is
an implementation optimization that leaks into the language level).
Hence, when the function is executed, Python does a fast lookup of
coin_toss in the local scope, finds it has not been assigned to, and
raises the error you're seeing, not falling back to and examining the
global variable scope.

To fix the problem, rename the variable so its name differs from that
of the coin_toss() function. That way, Python won't optimize the
lookup and will consult the global scope when it goes to resolve
coin_toss() in toss_winner().

Cheers,
Chris
 
B

Bruno Desthuilliers

Chris Rebert a écrit :
When Python sees this assignment to coin_toss as it compiles the
toss_winner() function, it marks coin_toss as a local variable and
will not consult global scope when looking it up at runtime (snip)
To fix the problem, rename the variable so its name differs from that
of the coin_toss() function.
(snip)

<OP>
As an additional note: in Python, everything is an object - including
modules, classes, and, yes, functions -, so there's no distinct
namespace for functions or classes. If you try to execute the "coin_toss
= coin_toss()" statement at the top level (or declare name 'coin_toss'
global prior using it in the toss_winner function), you wouldn't get an
UnboundLocalError, but after the very first execution of the statement
you would probably get a TypeError on subsquent attempts to call coin_toss:
.... print "coin_toss called"
.... return 42
....Traceback (most recent call last):

</OP>

HTH
 

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

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,527
Members
44,999
Latest member
MakersCBDGummiesReview

Latest Threads

Top