0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】forループとlambda式関数を組み合わせるときのTips

Last updated at Posted at 2023-12-05

概要

ご無沙汰しております。うらさくと申します
この記事はTechCommit Advent Calendar 2023の5日目の記事です
3年連続のアドカレです

今回はPythonのtkinterでボタンにlambda式関数をバインドするときに躓いたので、備忘録として共有します

修正前コード

buttons = [tkinter.Button(root, text="テスト", command=lambda: self.test_function(True, i)) for i in range(5)]

こんな感じでtkinterのボタンコンポーネントをfor文で5つ作る際、そのボタンのインデックス(0~4)を押したときに発火する関数の引数に入れたいというケースがありました

起こった事象

このコードを組み込んだプログラムを実行してそのボタンを押してみると、すべてのボタンでindexの引数に4、つまり、ループの最後の値が反映されていました

原因は、変数名はforループの各繰り返しで再代入されるという仕様でした

解決策

lambda式内でデフォルトのキーワードパラメータを使用することで解決できます

buttons = [tkinter.Button(root, text="テスト", command=lambda index=i: self.test_function(True, i)) for i in range(5)]

まとめ

tkinterに限らず、for文×lambdaの組み合わせはPythonではたまにあると思うので、同じところで詰まっている方は参考にしていただけると幸いです

参考

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?