Câu lệnh nonlocal trong Python
Có những trường hợp khi hàm ngoài
có một biến cần truy cập
từ hàm bên trong. Hãy khai báo trong
hàm outer biến i.
Đối với hàm bên trong, biến này
sẽ là biến ngoài (biến toàn cục
là những biến chỉ được khai báo
trong mã bên ngoài). Và cho hàm inner
chúng ta đặt phép cộng thêm một vào i:
def outer():
i = 0
def inner():
i += 1 # sẽ báo lỗi
inner()
return i
Tuy nhiên, đối với inner, biến i
là biến cục bộ, Python coi nó
chưa được khai báo và đưa ra lỗi
tương ứng. Trước đây, lỗi tương tự được khắc phục
bằng câu lệnh global. Tuy nhiên,
ở đây i là biến ngoài,
vì vậy nên sử dụng câu lệnh
nonlocal. Nó lấy các tên biến được liệt kê
từ phạm vi gần nhất,
loại trừ phạm vi toàn cục, tức là i
bên trong inner sẽ được lấy từ biến
được khai báo ở trên hàm này:
def outer():
i = 0
def inner():
nonlocal i
i += 1
inner()
return i
print(outer()) # sẽ in ra 1
Trong mã sau, một lập trình viên nào đó đã mắc lỗi:
num = 10
def outer():
num = 5
def inner():
num -= 2
inner()
return num
print(outer())
Có gì không ổn với mã này? Hãy tìm và sửa lỗi của tác giả mã.
Trong mã sau, một lập trình viên nào đó đã mắc lỗi:
num = 3
def outer():
num += 1
tst = num
def inner():
tst = tst ** 3
inner()
return tst
print(outer())
Có gì không ổn với mã này? Hãy tìm và sửa lỗi của tác giả mã.