November 10, 2011

Python: ว่าด้วยเรื่องขอบเขตตัวแปร

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

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

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

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



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



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


2 comments:

  1. มีคำถาม:

    1. nonlocal คือไม่ใช่ global และไม่ใช่ local แล้วถ้าใช้ nolocal ที่เลเวลแรก (ก่อน a = 42) มันจะหมายถึง ตัวแปร global ไหม?
    2. ถ้าซ้อนฟังชั่นไปเรื่อย ๆ nonlocal จะหมายถึงตัวแปรอันไหน? เช่นเลเวล 4 จะหมายถึง ตัวแปรที่ เลเวล 3 หรือ 1?
    3. ทำไมต้องมี end='' ในคำสั่ง print() ด้วย?

    แต่เอ๊ะ เขาสอน geek ไม่ใช่มือใหม่นี่นา XD

    ReplyDelete
  2. 1. nonlocal คือ ในกรณีที่หา local ไม่เจอ มันจะหาใน scope ที่ใหญ่ขึ้นครับ (แต่ส่วนใหญ่จะประกาศ nonlocal ไว้บนสุดอยู่แล้ว)
    2. มันจะจะค่อยๆ หาจาก scope ที่ใหญ่ขึ้นเรื่อยๆ ครับ (เช่น ซ้อน 4 ชั้น ก็หาจากชั้นที่ 3 ก่อน ถ้าไม่เจอก็ชั้น 2 แล้วก็ 1) แต่จะไม่ทะลุไปถึง global ครับ
    3. อันนี้ผมตั้งใจไม่อธิบายบางอย่าง เพื่อให้เกิดความสงสัย และลองแก้ code ดูเพื่อความเข้าใจด้วยตัวเองครับ XD

    ReplyDelete