local variable referenced before assignment
hat at se-162.se.wtb.tue.nl
Thu Oct 25 11:16:09 CEST 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)]
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.
More information about the Python-list