local variable referenced before assignment

A.T.Hofkamp hat at se-162.se.wtb.tue.nl
Thu Oct 25 05:16:09 EDT 2007


On 2007-10-25, Pete Bartonly <none at try.invalid> wrote:
>
> Quick question, probably quite a simple matter. Take the follow start of 
> a method:
>
>
> def review(filesNeedingReview):
>
>      for item in filesNeedingReview:
>          (tightestOwner, logMsg) = item
>
>          if (logMsg != None):
>              for logInfo in logMsg.changed_paths:
>
>
> This generates the error:
>
>    UnboundLocalError: local variable 'logMsg' referenced before assignment

This should work, are you sure you didn't make a typo in one of the names?

Another way to make this fail would be when the if-condition is outside
the loop (is the indentation correct in your code?).

A short demontration:
>>> def r(fnr):
...   for item in fnr:
...     w,m = item
...     if m == 2:
...       print w
...
>>> fnr = [(1,2), (3,4)]
>>> r(fnr)
1

With respect to compactness and style, you can move your multi-assignment
statement in the for loop, as in

for tightestOwner, logMsg in filesNeedingReview:

Also, brackets around conditions (in the if) are not needed, and comparing
against None is usually done with 'is' or 'is not' instead of '==' or '!='.
The result is then

if logMsg is not None:


> I thought I'd assigned it in the "(tightestOwner, logMsg) = item" line - 
> so in the python interpreter complaining about the fact this assignment 
> might not go well?

No, you'd get an error at that point in that case.


Sincerely,
Albert



More information about the Python-list mailing list