[Tutor] renaming input works intermittently

Steven D'Aprano steve at pearwood.info
Fri Jul 12 03:01:33 CEST 2013


On 12/07/13 10:44, Jim Mooney wrote:
> When I tried a simple rename of input, it worked - in python 2.7 and python 3.3
>
> import sys
> if int(sys.version[0]) < 3:
>      input = raw_input
>
> x = input('type something ')
> print(x)  # this works in both Py versions
>
> But when I tried that in my numbers program, I got an error:
> UnboundLocalError: local variable 'input' referenced before assignment
> for the below:

When you assign to a name *anywhere* inside a function, Python treats that name as a local variable regardless of whether it is before, or after, the assignment. So unlike the language Lua, you can't read a global variable, then create a local variable of the same name in the same function.

In your case, the fix is to pull the renaming of input out of the function, so it is performed once only, when the module first begins to run, instead of every time you call the function. Put the renaming code at the top of the module, after the "import sys", then just unconditionally use "input" inside the function.



>          try:
>              if int(sys.version[0]) < 3:
>                  input = raw_input
>              numbers_str = original = input('Enter a positive'
> 'integer, space separated if desired.') # error occurs here
> 				
> Oddly, the error only occurs in Python 3.3 - the above works in Python 2.7


The rules for local variables are rather more complicated in Python 2 and it may be that you're somehow slipping through the cracks.


-- 
Steven


More information about the Tutor mailing list