建议先看我上次发的作用域、闭包的概念
再看完廖老师的关于面向对象的高级编程,或者先看 定制类
最好有自己的思考,有时候虽然描述不同,但内核是一样的
print(type(range))
print(type(range(5)))
print(next(iter(range(5))))
runfile('E:/test3.py', wdir='E:')
<class 'type'>
<class 'range'>
0
def testFun():
temp = [lambda x : i*x for i in range(4)]
return temp
dis.dis('for f in testFun(): print(f(2))')
1 0 SETUP_LOOP 26 (to 28)
2 LOAD_NAME 0 (testFun)
4 CALL_FUNCTION 0
6 GET_ITER
>> 8 FOR_ITER 16 (to 26)
10 STORE_NAME 1 (f)
12 LOAD_NAME 2 (print)
14 LOAD_NAME 1 (f)
16 LOAD_CONST 0 (2)
18 CALL_FUNCTION 1
20 CALL_FUNCTION 1
22 POP_TOP
24 JUMP_ABSOLUTE 8
>> 26 POP_BLOCK
>> 28 LOAD_CONST 1 (None)
30 RETURN_VALUE
for f in testFun():
i = 7
print(f.__closure__[0].cell_contents)
3
3
3
3
能够透彻理解下面这个例子,那就应该是理解的差不多了
'''
Python 的闭包的后期绑定导致的 late binding,这意味着在闭包中的变量是在内部函数被调用的时候被查找。所以结果是,当任何 testFun() 返回的函数被调用,在那时,i 的值是在它被调用时的周围作用域中查找
'''
IN:
def testFun():
temp = [lambda x : i*x for i in range(4)]
return temp
def testFun2():
temp = (lambda x : i*x for i in range(4))
return temp
gen = testFun2()
print([f(2) for f in testFun()])
print([f(2) for f in testFun2()])
print([f(2) for f in gen])
print([f(2) for f in gen])
OUT:
[6, 6, 6, 6]
[0, 2, 4, 6]
[0, 2, 4, 6]
[]