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

1 คิดบน “Closure ใน Python

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

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

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s