125 lines
3.1 KiB
ReStructuredText
125 lines
3.1 KiB
ReStructuredText
>>> def f1(a):
|
|
... print(a)
|
|
... print(b)
|
|
...
|
|
>>> f1(3)
|
|
3
|
|
Traceback (most recent call last):
|
|
File "<stdin>", line 1, in <module>
|
|
File "<stdin>", 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 "<stdin>", line 1, in <module>
|
|
File "<stdin>", 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
|
|
|
|
|