One can look at what is happening with a little help from the built-in dis module:
import dis
def my_fun(foo,bar):
foo
return foo + bar
dis.dis(my_fun)
The dis.dis
function disassembles functions (yep, it can disassemble itself), methods, and classes.
The output of dis.dis(my_fun)
is:
4 0 LOAD_FAST 0 (foo)
3 POP_TOP
5 4 LOAD_FAST 0 (foo)
7 LOAD_FAST 1 (bar)
10 BINARY_ADD
11 RETURN_VALUE
The first two bytecodes are exactly what we need: the foo
line.
Here's what these bytecodes do:
- The first one pushes a reference to a local variable
foo
onto the stack (LOAD_FAST) - The second one removes the top of the stack (POP_TOP)
Basically, foo
line has no effect. (well, if foo
variable is not defined then LOAD_FAST
will throw the NameError
)