🔹 تا حالا شده توی یک حلقه چندتا لمداسازی (Lambda) کنی و موقع اجرا ببینی همه با هم یک جواب تکراری میدن؟! این دقیقاً به خاطر پدیده Late Binding (ارزیابی دیرهنگام) در پایتونه.
🔹 کد مشکلدار:
funcs = [lambda: i for i in range(3)]
for f in funcs:
print(f()) # خروجی: 2, 2, 2 !
🔹 دلیلش چیه؟
پایتون مقدار متغیر i رو موقع تعریف لمدا ذخیره نمیکنه، بلکه موقع اجرا (Call) به سراغ مقدار نهایی i توی حافظه میره!
🔹 راه حل استاندارد (با استفاده از Default Argument):
funcs = [lambda x=i: x for i in range(3)]
for f in funcs:
print(f()) # خروجی: 0, 1, 2 (درست شد!)
🔹 به چه دردی میخوره؟
این باگ توی پروژههای واقعی (مثل ساخت Callback برای دکمههای UI یا تعاریف Dynamic توی دیتابیس و کارهای Async) خیلی زیاد اتفاق میافته و فهمیدنش جلوی ساعتها دیباگینگ گیجکننده رو میگیره.
🐍 @python_rd