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 ก่อนหน้าได้

Comments (1)

neizodNovember 20th, 2011 at 1:17 pm

มีความรู้สึกเหมือนกับว่า Python ทำ closure ได้เองด้วย syntax + variable scope + pass by value เดิมๆ เลยแฮะ (ไม่ต้องมีอะไรเพิ่มเติมอีก)

ว่าแต่ เราไม่ควรไปแก้ไขค่าของตัวแปรใน closure อยู่แล้วหรือเปล่าครับ?

[Reply]

Leave a comment

Your comment