閉包函數(shù) 綁定的外部變量問(wèn)題
'''
Python進(jìn)階2-8返回函數(shù)
Python進(jìn)階2-8返回函數(shù)
Python進(jìn)階2-8返回函數(shù)
'''
# 但是,如果返回一個(gè)函數(shù),就可以“延遲計(jì)算”: ?
def calc_sum(lst):
? ? def lazy_sum():
? ? ? ? return sum(lst)
? ? return lazy_sum ? ? ? # 試試 return lazy_sum()
# 調(diào)用calc_sum()并沒有計(jì)算出結(jié)果,而是返回函數(shù):
f = calc_sum([1, 2, 3, 4]) ?# 【相當(dāng)于將函數(shù)名lazy_sum賦值給變量f】
k = calc_sum([1, 2, 3, 4])
j = calc_sum([1, 2, 4, 5])
print(id(f),f.__closure__[0].cell_contents) ? # 再看看k和j,發(fā)現(xiàn)三者內(nèi)存地址,__closure__屬性是不同的
print(id(k),k.__closure__[0].cell_contents)
print(id(j),j.__closure__[0].cell_contents)
# 對(duì)返回的函數(shù)進(jìn)行調(diào)用時(shí),才計(jì)算出結(jié)果:
f() ?# 返回10
#########################################################
'''
Python進(jìn)階2-9閉包
Python進(jìn)階2-9閉包
Python進(jìn)階2-9閉包
'''
# 希望一次返回3個(gè)函數(shù),分別計(jì)算1x1,2x2,3x3:
def count():
? ? fs = []
? ? for i in range(1, 4):
? ? ? ? def f():
? ? ? ? ? ? ?return i*i
? ? ? ?#print(id(f),f.__closure__[0].cell_contents,id(i))
? ? ? ? fs.append(f)
? ? return fs
f1, f2, f3 = count()
#print(id(f1),f1.__closure__[0].cell_contents,id(f2),f2.__closure__[0].cell_contents,id(f3),f3.__closure__[0].cell_contents)
print(f1(),f2(),f3())
'''
你可能認(rèn)為調(diào)用f1(),f2()和f3()結(jié)果應(yīng)該是1,4,9,但實(shí)際結(jié)果全部都是 9
(請(qǐng)自己動(dòng)手驗(yàn)證)。
原因就是當(dāng)count()函數(shù)返回了3個(gè)函數(shù)時(shí),這3個(gè)函數(shù)所引用的變量 i 的值
已經(jīng)變成了3。由于f1、f2、f3并沒有被調(diào)用,所以,此時(shí)他們并未計(jì)算 i*i,
當(dāng) f1 被調(diào)用時(shí):
'''
print(f1()) ? ?# 返回9 # 因?yàn)閒1現(xiàn)在才計(jì)算i*i,但現(xiàn)在i的值已經(jīng)變?yōu)?
2016-03-01
為什么 第二個(gè)實(shí)例中 的 變量i 最終變成了3。
而第一個(gè)實(shí)例中的 lst 沒有改變。
2016-02-24
你的問(wèn)題是?