建議先看我上次發的作用域、閉包的概念
再看完廖老師的關於面向對象的高級編程,或者先看 定製類
最好有自己的思考,有時候雖然描述不同,但內核是一樣的
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]
[]