Closure ใน Python
แฮ่ วันนี้ลองเล่น closure ใน python เต็มที่เลยครับ
funcs = [] i=0 def funcfactory(): global i i += 1 j = i def callback(): print j funcs.append(callback) funcfactory() # ได้ callback ที่มี j = 1 funcfactory() # ได้ callback ที่มี j = 2 funcfactory() # ได้ callback ที่มี j = 3 print funcs for f in funcs: f()
list funcs จะเก็บ function ‘callback’ ที่มีโค้ดแบบเดียวกัน (print j) แต่มี context ต่างกัน (j = 1, 2, 3)
closure = (function, environment ของฟังก์ชั่น)
Edit: ข้อจำกัดสำคัญของ Closure ใน python คือ “อ่านได้อย่างเดียว” วิธีแก้ปัญหาทำได้โดยส่ง reference แทนตามตัวอย่างใน [ref]
ใน Python 3 มีคีย์เวิร์ด nonlocal ไว้ใช้อ้างถึงตัวแปรที่อยู่ใน Scope ก่อนหน้าได้
มีความรู้สึกเหมือนกับว่า Python ทำ closure ได้เองด้วย syntax + variable scope + pass by value เดิมๆ เลยแฮะ (ไม่ต้องมีอะไรเพิ่มเติมอีก)
ว่าแต่ เราไม่ควรไปแก้ไขค่าของตัวแปรใน closure อยู่แล้วหรือเปล่าครับ?
[Reply]