次のコードでは、ボタンを作成する 2 つの方法の動作が異なります。
from Tkinter import *
def buildButton1():
root = Tk()
Button( root, command = lambda : foo(1) ).pack()
Button( root, command = lambda : foo(2) ).pack()
def buildButton2():
root = Tk()
buttons = ( Button( root, command = lambda : foo(i) ) for i in range(2) )
map( lambda button : button.pack(), buttons )
def foo( number ):
print number
どちらの方法でも、表向きは同じ 2 つのボタン レイアウトを持つ Tkinter ウィンドウが作成されますが、2 つ目の例では、2 つではなく 50 個のボタンを追加した方がはるかに簡潔に見えます。foo に渡される値は、最後に反復された i です。
したがって、この場合、buildButton2 で作成されたボタンを押すと 1 が出力され、buildButton1 のボタンはそれぞれ 0 と 1 が出力されます。なぜ違いがあるのですか?buildButton2 を期待どおりに動作させる方法はありますか?
編集 これは重複した質問であり、これを構築するより正しい方法は次のように書くことであることが指摘されています。
buttons = ( Button( root, command = lambda i=i : foo(i) ) for i in range(2) )
これにより、望ましい結果が得られます。みんなありがとう!