>>> def f1(a): ... print(a) ... print(b) ... >>> f1(3) 3 Traceback (most recent call last): File "", line 1, in File "", line 3, in f1 NameError: name 'b' is not defined >>> b = 6 >>> f1(3) 3 6 >>> def f2(a): ... print(a) ... print(b) ... b = 9 ... >>> f2(3) 3 Traceback (most recent call last): File "", line 1, in File "", line 3, in f2 UnboundLocalError: local variable 'b' referenced before assignment # tag::F1_DIS[] >>> from dis import dis >>> dis(f1) 2 0 LOAD_GLOBAL 0 (print) <1> 3 LOAD_FAST 0 (a) <2> 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 9 POP_TOP 3 10 LOAD_GLOBAL 0 (print) 13 LOAD_GLOBAL 1 (b) <3> 16 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 19 POP_TOP 20 LOAD_CONST 0 (None) 23 RETURN_VALUE # end::F1_DIS[] # tag::F2_DIS[] >>> dis(f2) 2 0 LOAD_GLOBAL 0 (print) 3 LOAD_FAST 0 (a) 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 9 POP_TOP 3 10 LOAD_GLOBAL 0 (print) 13 LOAD_FAST 1 (b) <1> 16 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 19 POP_TOP 4 20 LOAD_CONST 1 (9) 23 STORE_FAST 1 (b) 26 LOAD_CONST 0 (None) 29 RETURN_VALUE # end::F2_DIS[] >>> def f3(a): ... global b ... print(a) ... print(b) ... b = 9 ... >>> f3(3) 3 6 >>> b 9 # tag::F3_DIS[] >>> dis(f3) 3 0 LOAD_GLOBAL 0 (print) 3 LOAD_FAST 0 (a) 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 9 POP_TOP 4 10 LOAD_GLOBAL 0 (print) 13 LOAD_GLOBAL 1 (b) 16 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 19 POP_TOP 5 20 LOAD_CONST 1 (9) 23 STORE_GLOBAL 1 (b) 26 LOAD_CONST 0 (None) 29 RETURN_VALUE # end::F3_DIS[] >>> def f4(b): ... def f5(a): ... nonlocal b ... print(a) ... print(b) ... b = 7 ... return f5 ... >>> f5 = f4(8) >>> f5(2) 2 8 >>> b 9 >>> f5(3) 3 7???? >>> dis(f5) 4 0 LOAD_GLOBAL 0 (print) 3 LOAD_FAST 0 (a) 6 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 9 POP_TOP 5 10 LOAD_GLOBAL 0 (print) 13 LOAD_DEREF 0 (b) 16 CALL_FUNCTION 1 (1 positional, 0 keyword pair) 19 POP_TOP 6 20 LOAD_CONST 1 (7) 23 STORE_DEREF 0 (b) 26 LOAD_CONST 0 (None) 29 RETURN_VALUE