Phân biệt các biến global, local và nonlocal trong Python

Đây là bài 16/54 bài của series môn học Ngôn ngữ lập trình Python

1. Biến local trong Python

Biến cục bộ (local) là những biến được tạo ra trong thân của một hàm. Các biến này chỉ được sử dụng bên trong hàm đó. Ví dụ:

def myFunction():
    # local variable
    s = "Gochocit.com"
    print(s)

myFunction()
Kết quả
Gochocit.com

Trong ví dụ trên, biến s là biến cục bộ và chỉ được sử dụng bên trong hàm myFunction(). Trong trường hợp sử dụng biến s ở bên ngoài hàm myFunction() thì sẽ gây ra lỗi.

def myFunction():
    # local variable
    s = "Gochocit.com"
    print(s)

print(s)
Kết quả
NameError: name 's' is not defined

2. Biến global trong Python

Biến toàn cục (global) là những biến được tạo ra không ở trong thân bất kỳ hàm nào mà ở phạm vi toàn cục (global scope). Biến toàn cục có phạm vi sử dụng trong toàn bộ chương trình, cả bên trong hoặc bên ngoài của bất kỳ hàm nào. Ví dụ:

# global variable
s = "Gochocit.com"
def myFunction():
    print("Inside myFunction", s)

myFunction()
print("Outside myFunction", s)
Kết quả
Inside myFunction Gochocit.com
Outside myFunction Gochocit.com

Biến s là biến toàn cục bên có thể được sử dụng cả bên trong và bên ngoài hàm myFunction().

Nếu biến cục bộbiến toàn cục cùng tên với nhau thì sẽ như thế nào? Ví dụ:

# global variable
s = "Gochocit.com"
def myFunction():
    #local variable
    s = "Hello all!"
    print(s)

myFunction()
print(s)
Kết quả
Hello all!
Gochocit.com

Biến s được tạo trong hàm myFunction() là biến cục bộ. Khi in biến s trong hàm myFunction() thì chương trình sẽ sử dụng biến cục bộ chứ không phải biến toàn cục.

Có trường hợp chúng ta cố thay đổi giá trị của biến toàn cục bên trong hàm thì sẽ như thế nào? Ví dụ:

# global variable
s = "Gochocit.com"
def myFunction():
    #local variable
    s = s + "is great!"
    print(s)

myFunction()
Kết quả
UnboundLocalError: local variable 's' referenced before assignment

Kết quả là chúng ta sẽ gặp lỗi UnboundLocalError. Lỗi này là do Python xem biến s là biến cục bộ. Và khi biến s chưa được gán giá trị mà lại thực hiện toán tử + với một chuỗi (string) khác nên gây ra lỗi. Nếu các bạn sửa lại như sau thì sẽ không gây ra lỗi:

# global variable
s = "Gochocit.com"
def myFunction():
    #local variable
    s = "All"
    s = s + " is great!"
    print(s)

myFunction()
Kết quả
All is great!

Lưu ý: Biến s trong hàm myFunction() thì Python vẫn xem là biến cục bộ nhé!

Nếu bạn muốn chỉ định tên biến trong hàm là biến toàn cục chứ không phải là biến cục bộ thì có thể sử dụng từ khóa global. Ví dụ:

# global variable
s = "Gochocit.com"
def myFunction():
    global s
    s = s + " is great!"
    print("Inside function:", s)

myFunction()
print("Outside function:", s)
Kết quả
Inside function: Gochocit.com is great!
Outside function: Gochocit.com is great!

Bây giờ, Python sẽ biết biến s là biến toàn cục đã được khái báo bên ngoài hàm chứ không phải là biến cục bộ nữa.

3. Biến nonlocal trong Python

Các biến nonlocal được sử dụng trong các hàm lồng nhau (inner function). Lúc này, phạm vi cục bộ của biến không được xác định. Điều này có nghĩa là biến không thể nằm trong phạm vi cục bộ hoặc toàn cục. Sử dụng từ khóa nonlocal để tạo các biến nonlocal. Ví dụ:

def outerFunction():
    x = "Gochocit.com"

    def innerFunction():
        nonlocal x
        x = "Hello all!"
        print("inner:", x)

    innerFunction()
    print("outer:", x)

outerFunction()
Kết quả
inner: Hello all!
outer: Hello all!

Lưu ý: Nếu chúng ta thay đổi giá trị của một biến nonlocal thì biến cục bộ cũng sẽ thay đổi.

5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Tham số (parameter) của hàm trong PythonHàm đệ quy (recursive function) trong Python >>
Chia sẻ trên mạng xã hội:

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.