閉包引起值變化(轉)
阿新 • • 發佈:2017-09-03
.com dex adding key study 引用 print value turn
python的閉包當內層函數引用外層函數的局部變量時,要正確使用閉包,就要確保引用的局部變量在函數返回後不能變。
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def count():
fs = []
for i in range ( 1 , 4 ):
def lazy_count(j):
def cou():
return j * j
return cou
r = lazy_count(i)
fs.append(r)
return fs
f1, f2, f3 = count()
print f1(), f2(), f3()
|
如果以上代碼寫成如下:
1 2 3 4 5 6 7 8 9 |
def count():
fs = []
for i in range ( 1 , 4 ):
def f():
return i * i
fs.append(f)
return fs
f1, f2, f3 = count()
|
最終得到的f1, f2, f3就都是9,是因為這行:
1 |
f1, f2, f3 = count()
|
裏得到的count()函數中的f()函數中的i已經叠代至3了,最終得出的結果只能是9 9 9
而剛開始給出的代碼中f1,f2,f3其實得到的是一個序列而已,而計算這個序列中每個元素時引用的閉包中的外層函數中的變量隨著叠代變更,從1至3,並且同時計算出該次叠代所得的元素值append進序列返回,顧最終結果為1 4 9
本文出自 “keep_study_zh” 博客,請務必保留此出處http://zhkpsty.blog.51cto.com/9013616/1695120
閉包引起值變化(轉)