倒騰了一個下午,最后確定了問題在于for循環(huán)中創(chuàng)建的函數(shù)中變量的值會被覆蓋。如下列代碼所示: 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)程序運行結(jié)果如下:我的問題是:為什么會有個None如何在for循環(huán)中利用循環(huán)變量批量創(chuàng)建函數(shù)謝謝!
1 回答

慕萊塢森
TA貢獻(xiàn)1810條經(jīng)驗 獲得超4個贊
為什么會有個None
因為print(funcList[0]())
語句中, funcList[0]()
的返回值是None:
def printI(): # 這里打印了i_List[i], 加一個括號, 但是不換行 print(i_List[i], end = ',') # 所有不顯示返回的返回值都是None # 外層再有一個print()的話,就會打印`None`
如何在for循環(huán)中利用循環(huán)變量批量創(chuàng)建函數(shù)
這是個陷阱,情況跟Javascript類似。printI這個閉包捕獲了i這個變量(捕獲的是變量本身而不是變量的值), 但是i變量是變化的, 所以最后的結(jié)果都是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
提交
取消