|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- def count():
- fs = []
- for i in range(1, 4):
- def f():
- return i*i
- fs.append(f)
- return fs
- f1, f2, f3 = count()
复制代码
疑问一:fs是个列表,那么count()的返回值就是个列表,type(count())类型为列表,这个函数还是个闭包吗?
疑问二:f1, f2, f3 = count() 是否等价于a1, a2, a3 =[f(1),f(2),f(3)],原理是什么(type(f1)为函数,type(count())为list)?
疑问三:针对f1(),f2(),f3()函数最后运行结果均为9,跪求代码详细运行步骤分析,一定要详细
LOAD_CLOSURE
MAKE_CLOSURE
这2个字节码是构造闭包的指令,所以,fs 里保存的是闭包对象。
因为,闭包里只保存了i的引用,所以在闭包执行时,得到i最后的值( 3)
>>> import dis
>>> def count():
fs = []
for i in range(1, 4):
def f():
return id(i),i*i
fs.append(f)
return fs
>>> dis.dis(count)
2 0 BUILD_LIST 0
3 STORE_FAST 0 (fs)
3 6 SETUP_LOOP 54 (to 63)
9 LOAD_GLOBAL 0 (range)
12 LOAD_CONST 1 (1)
15 LOAD_CONST 2 (4)
18 CALL_FUNCTION 2 (2 positional, 0 keyword pair)
21 GET_ITER
>> 22 FOR_ITER 37 (to 62)
25 STORE_DEREF 0 (i)
4 28 LOAD_CLOSURE 0 (i)
31 BUILD_TUPLE 1
34 LOAD_CONST 3 (<code object f at 0x019FC5C0, file "<pyshell#87>", line 4>)
37 LOAD_CONST 4 ('count.<locals>.f')
40 MAKE_CLOSURE 0
43 STORE_FAST 1 (f)
6 46 LOAD_FAST 0 (fs)
49 LOAD_ATTR 1 (append)
52 LOAD_FAST 1 (f)
55 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
58 POP_TOP
59 JUMP_ABSOLUTE 22
>> 62 POP_BLOCK
7 >> 63 LOAD_FAST 0 (fs)
66 RETURN_VALUE
>>> l=count()
>>> l[0](),l[1](),l[2]()
((505996176, 9), (505996176, 9), (505996176, 9))
>>>
|
|