UnboundLocalError - (code is short & simple)

Chris Kaynor ckaynor at zindagigames.com
Mon Sep 28 00:17:30 EDT 2009


Lets look at what is happening on a few of the lines here:

First:
from coin_toss import coin_toss

imports the module coin_toss and sets the local variable coin_toss to the
value of coin_toss in the module coin_toss.


Second:
coin_toss = coin_toss()

calls the function bound to the name coin_toss and assigns the result to
coin_toss. Now this appears to be what you want (and run outside a function
it would work as you intend, the first time). However, within a function, a
different namespace exists, and Python sees that you are assigning to
coin_toss, and thus uses the local version of that variable everywhere else
within the function. As such, Python is attempting to call the
local variable coin_toss, which has not yet been assigned too.



While not really the "correct" solution, you may want to look into the
global keyword for more information about your problem.



Chris


On Sun, Sep 27, 2009 at 8:53 PM, pylearner <for_python at yahoo.com> wrote:

> 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
> --
> http://mail.python.org/mailman/listinfo/python-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20090927/4eac0511/attachment-0001.html>


More information about the Python-list mailing list