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:

pythondef 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:

pythondef outer():
  i = 0

  def inner():
    nonlocal i
    i += 1

  inner()

  return i

print(outer()) # sẽ in ra 1
Задание 1

Trong mã sau, một lập trình viên nào đó đã mắc lỗi:

pythonnum = 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ã.

Задание 2

Trong mã sau, một lập trình viên nào đó đã mắc lỗi:

pythonnum = 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ã.