Дастури nonlocal дар Python
Ҳолатҳое пеш меоянд, ки дар функсияи берунӣ
тағирёбандае вуҷуд дорад, ки ба он дастрасӣ
дар функсияи дохилӣ лозим аст. Дар функсияи
outer тағирёбандаи i-ро
эълон мекунем.
Нисбат ба функсияи дохилӣ ин тағирёбанда
берунӣ (глобалӣ) хоҳад буд (глобалӣ
тағирёбандаҳое ҳастанд, ки ТАНҲО
дар рамзи берунӣ эълон шудаанд). Ва ба функсияи inner
афзудани як воҳид ба i-ро таъин мекунем:
def outer():
i = 0
def inner():
i += 1 # хатои "local variable 'i' referenced before assignment"
inner()
return i
Аммо барои inner тағирёбандаи i
маҳаллӣ аст, Python онро ноэълоншуда мешуморад ва хатои мувофиқро
бармегардонад. Пештар ин гуна хато бо ёрии дастури
global ислоҳ мешуд. Аммо
дар ин ҷо i тағирёбандаи берунӣ аст,
бояд дастури
nonlocal истифода шавад. Ин номҳои тағирёбандаҳоро
ба наздиктарин ҳудуди дида бароӣ мегирад,
глобалиро истисно мекунад, яъне i
дар дохили inner аз тағирёбандае гирифта мешавад,
ки болотар аз ин функсия эълон шудааст:
def outer():
i = 0
def inner():
nonlocal i
i += 1
inner()
return i
print(outer()) # 1-ро бармегардонад
Дар коди зерин баъзе барномасоз хато кардааст:
num = 10
def outer():
num = 5
def inner():
num -= 2
inner()
return num
print(outer())
Ин код чист? Хаторо ёбед ва ислоҳ кунед.
Дар коди зерин баъзе барномасоз хато кардааст:
num = 3
def outer():
num += 1
tst = num
def inner():
tst = tst ** 3
inner()
return tst
print(outer())
Ин код чист? Хаторо ёбед ва ислоҳ кунед.