Nattawut Phetmak
Jack of all Trades
ใน 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()