This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2010年06月21日 19:46 by Andreas Hofmeister, last changed 2022年04月11日 14:57 by admin. This issue is now closed.
| Messages (4) | |||
|---|---|---|---|
| msg108306 - (view) | Author: Andreas Hofmeister (Andreas Hofmeister) | Date: 2010年06月21日 19:46 | |
Description: An unexpected UnboundLocalError is produced when assigning a value to a variable inside a nested function. The first assignment to the variable is in the enclosing function. Example: def x(): a = False def y(): print a a = True return y Calling x()() produces an UnboundLocalError on the 'print a' line. If the 'a = True' line is removed, no error occurs. Tested with: - 2.5.1 - 2.6.5 Keywords: Nested function, UnboundLocalError, variable assignment Thank you for your attention |
|||
| msg108309 - (view) | Author: Mark Dickinson (mark.dickinson) * (Python committer) | Date: 2010年06月21日 19:52 | |
This isn't a bug; it's by design. Because there's an assignment to 'a' in the function 'y', 'a' is considered local to that function. (It doesn't matter where the assignment happens within the function; the presence of an assignment anywhere is enough to make 'a' local for the entirety of 'y'.) This is described in the reference manual at: http://docs.python.org/reference/executionmodel.html#naming-and-binding See the paragraph beginning: "If a name binding operation occurs anywhere within a code block, " |
|||
| msg108337 - (view) | Author: Andreas Hofmeister (Andreas Hofmeister) | Date: 2010年06月22日 05:11 | |
Thank you for your assistance. I apologize for not examining the reference manual closely. Is there any way to produce the desired behavior? I currently work around the local name binding like this: def x(): a = [False] def y(): print a[0] a[0] = True return y However, using a list here seems awkward. Thank you for your attention. |
|||
| msg108345 - (view) | Author: Mark Dickinson (mark.dickinson) * (Python committer) | Date: 2010年06月22日 08:26 | |
> Is there any way to produce the desired behavior? Not directly, in Python 2.x. (But there's the 'nonlocal' keyword in 3.x.) There are various workarounds, but what's best depends on what you're doing. The python-list mailing list is probably a better place to get answers. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:02 | admin | set | github: 53295 |
| 2010年06月22日 08:26:14 | mark.dickinson | set | messages: + msg108345 |
| 2010年06月22日 05:11:16 | Andreas Hofmeister | set | messages: + msg108337 |
| 2010年06月21日 19:55:05 | eric.araujo | set | stage: resolved |
| 2010年06月21日 19:52:40 | mark.dickinson | set | status: open -> closed nosy: + mark.dickinson messages: + msg108309 resolution: not a bug |
| 2010年06月21日 19:46:37 | Andreas Hofmeister | create | |