Scope

ใน Python ถึงแม้เราจะสามารถใช้ฟังก์ชันอ่านตัวแปรใน global scope ได้ เช่น

    a = 1
    def read():
        print(a)

    read()      # get: 1

หรือแม้กระทั่งทำบางอย่าง

    def incr(n):
        n += 1
        print(n)

    incr(a)    # get: 2
    print(a)   # get: 1

แต่เราจะเห็นว่า ค่าของตัวแปรดั้งเดิมนั้น ไม่เปลี่ยนแปลง (เพราะเป็นการส่ง by value ไม่ใช่ by reference) ถ้าต้องการอ้างตัวแปรนั้นๆ มาใช้ในฟังก์ชัน ต้องประกาศ global ครับ

    num = 1
    txt = ''

    def mod():
        '''this function can modify global variable.'''
        global num, txt
        num += 1
        txt = ['hello!', 'how are you?'][num%2]
        print(a, b)

    def read_only():
        '''but this function can not modify them.'''
        print(a, b)

ยกเว้นก็แต่พวก list, object นะครับ ที่ใช้การส่ง by reference เป็นปรกติอยู่แล้ว


นอกจากนี้แล้ว ยังมี nonlocal อีกด้วย

    a = 1
    def hitchhiker():
        a = 42
        def answer():
            nonlocal a
            print(a)
        def normal():
            global a
            print(a)
        answer()    # get: 42 (hitchhiker scope)
        normal()    # get:  1 (global scope)

และด้วย scope ที่ต่างจากภาษาอื่นแบบนี้เอง ทำให้เราสามาถทำท่าแปลกๆ เช่นนี้ได้

    # draw 24x79 dots on screen.
    for i in range(24):
        for i in range(79):
            print('.', end='')
        print()

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus