倒騰了一個下午,最后確定了問題在于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)...
添加回答
舉報
0/150
提交
取消
