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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么會有個None ?請問該如何在for循環中利用循環變量批量創建函數?

為什么會有個None ?請問該如何在for循環中利用循環變量批量創建函數?

楊__羊羊 2023-04-30 05:01:42
倒騰了一個下午,最后確定了問題在于for循環中創建的函數中變量的值會被覆蓋。如下列代碼所示:    funcList = []     i_List = []    for i in range(0, 3):         i_List.append(i)         def printI():            print(i_List[i], end = ',')         funcList.append(printI)         print(funcList[0]() )    print(funcList[1]() )    print(funcList[2]() )    print(i_List)程序運行結果如下:我的問題是:為什么會有個None如何在for循環中利用循環變量批量創建函數謝謝!
查看完整描述

1 回答

?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

為什么會有個None

因為print(funcList[0]())語句中, funcList[0]()的返回值是None:

def printI():    # 這里打印了i_List[i], 加一個括號, 但是不換行
    print(i_List[i], end = ',')    # 所有不顯示返回的返回值都是None
    # 外層再有一個print()的話,就會打印`None`
如何在for循環中利用循環變量批量創建函數

這是個陷阱,情況跟Javascript類似。printI這個閉包捕獲了i這個變量(捕獲的是變量本身而不是變量的值), 但是i變量是變化的, 所以最后的結果都是i在迭代后的最后一個值。
因此,有幾個辦法可以繞過(不限于以下幾種):

1.

...    def printI(x):        def _printI():
            print(i_List[x], end = ',')        return _printI
    funcList.append(printI(i))
...

2.

from functools import partial
...    def printI(x):        print(i_List[x], end = ',')
    funcList.append(partial(printI, i))
...

3.

...
    def printI(i=i):        print(i_List[i], end = ',')
    funcList.append(printI)...


查看完整回答
反對 回復 2023-05-02
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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