亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

python閉包的問題

#?希望一次返回3個函數,分別計算1x1,2x2,3x3:
def?count():
????fs?=?[]
????for?i?in?range(1,?4):
????????def?f():
?????????????return?i*i
????????fs.append(f)
????return?fs

f1,?f2,?f3?=?count()

請教一下為什么返回的是三個函數?

我的理解count函數返回的是 list fs[],而循環for i in range(1,4)中 fs.append(f)執行了三次(分別i=1\2\3),

那么fs.append(f)后,fs中保存的是函數名f 還函數f()的返回值i*i??

可是在循環結束我print fs結果為[, , ]??梢奱ppend()方法執行了,但為什么添加的內容卻為空?


示例說:

由于f1、f2、f3并沒有被調用,所以,此時他們并未計算 i*i,當 f1 被調用時:

>>>?f1()
9?????#?因為f1現在才計算i*i,但現在i的值已經變為3

? 如果這樣的話fs[]中保存的就應該是函數名吧?。康€是不理解print fs結果為[, , ],而且print f1也是''

難道發fs[]中保存的哪種不能輸出的數據?

print count

lst = count()

print lst

lst.append(count)

print lst

輸出結果為

[,?,?]
[,?,?,?]

print count 沒有輸出,可見fs[]中的確保存的是一種關聯‘函數名‘的數據,有點像c中的指針,但是這種數據不能通過print輸出?!

如果這樣的話for 循環中每次def f()雖然名稱相同但是實際還是不同,但是python中能夠有重名的函數?

試了一下python中的確可以有命名相同的函數,但是看效果應該是后面的函數覆蓋了前面的函數。如果這樣的話前面雖然fs[]中保存了三個函數但是實際上有效的就是最后一個,此時i=3.倒也符合

def count():

? ? fs = []

? ? for i in range(1, 4):

? ? ? ? def f(i):

? ? ? ? ? ? ?return i*i

? ? ? ? fs.append(f(i))

? ? print fs

? ? return fs

這里的輸出卻是[1,4,9],也就是說fs保存的是函數的f(i)的返回值。。。到這里我已經懵逼了...這里是我搞混了即使是f(i),f才是函數名,f(i)是直接調用函數,? fs.append(f(i))本身就有問題


正在回答

1 回答

你的描述看了一部分,感覺你已經完全被繞暈了。所以不針對你的提問一一回答,只說一下我覺得正確的理解,你可以看完后跑一下,我沒有跑不保證每處細節都正確。

首先,fs 是一個 list,只不過其中的元素不是數字而是函數。也就是說(fs[0])(),是可以調用該函數的。另外,i 的作用域實在count函數內的,所以當延遲調用 fs 里的任意函數時,去尋找 i 的值時,i 已經變成了 3。所以所有的結果都是9。另外 f1, f2, f3 = count(),是結構賦值語句,也就是說 f1 是 fs 里的第一個函數。f1 == fs[0]

2 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
python進階
  • 參與學習       255550    人
  • 解答問題       3038    個

學習函數式、模塊和面向對象編程,掌握Python高級程序設計

進入課程

python閉包的問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號