1. Biến cục bộ trong Python

Trong Python, biến cục bộ là các biến được khai báo và sử dụng trong một phạm vị của một hàm, một đối tượng…

Ví dụ về việc khai báo một biến trong hàm def tinhtong() như sau:

# Khai bao ham
def tinhtong():
    x = 10 # Bien cuc bo x trong ham tinhtong()
    return x;

# Hien thi gia tri
print(tinhtong())

Kết quả:

10

Trong ví dụ trên, biến x là một biến cục bộ thuộc trong hàm def tinhtong(). Khi đó x chỉ được sử dụng trong hàm này, nếu chúng ta sử dụng biến x ở bên ngoài hàm chương trình sẽ gây lỗi như sau:

# Khai bao ham
def tinhtong():
    x = 10 # Bien cuc bo x trong ham tinhtong()
    return x;

# Hien thi gia tri x ben ngoai ham tinhtong()
print(x)

Kết quả:

NameError: name ‘x’ is not defined

Lỗi: “NameError: name ‘x’ is not defined” xuất hiện là do chúng ta đã cố truy cập vào biến cục bộ x trong phạm vi toàn cục – phạm vi này là bên ngoài hàm def tinhtong(), tuy nhiên, biến x chỉ làm việc trong hàm def tinhtong() hoặc phạm vi cục bộ.

2. Biến toàn cục trong Python

Trong Python, biến toàn cục là một biến được khai báo bên ngoài hàm hoặc trong phạm vi toàn cục. Biến toàn cục có phạm vi sử dụng rộng hơn biến cục bộ . Biến toàn cục hoàn toàn có thể được truy cập từ bên trong hoặc bên ngoài hàm.

Ví dụ về việc khai báo một biến y là một biến toàn cục – biến này sẽ nằm bên ngoài tất cả các hàm. Tuy nhiên biến y này lại có thể sử dụng trong tất cả các hàm:

# Khai bao bien toan cuc y
y = 10

# Khai bao ham
def tinhtong():
    return y # Su dung bien toan cuc y trong ham tinhtong()

# Hien thi gia tri y trong ham tinhtong()
print("Gia tri y cua ham tinhtong() la: {0}".format(tinhtong()))

# Hien thi gia tri y ban dau
print("Gia tri y ban dau la: {0}".format(y))

Kết quả:

Gia tri y cua ham tinhtong() la: 10
Gia tri y ban dau la: 10

Khi sử dụng biến toàn cục, việc thay đổi giá trị của biến toàn cục ở trong phạm vi của hàm sẽ gây ra lỗi. Ví dụ khi ta thay đổi giá trị của biến y trong hàm def tinhtong() thì sẽ gây ra lỗi sau:

# Khai bao bien toan cuc y
y = 10

# Khai bao ham
def tinhtong():
    y *= 2 # Thay doi gia tri bien toan cuc y trong ham tinhtong()
    return y 

# Hien thi gia tri y sau khi thay doi gia tri trong ham tinhtong()
print(tinhtong())

Kết quả:

UnboundLocalError: local variable ‘y’ referenced before assignment

Lỗi “UnboundLocalError: local variable ‘y’ referenced before assignment” xuất hiện là do Python coi y là một biến cục bộ và y không được định nghĩa trong hàm def tinhtong(). Để khắc phục lỗi này, ta cần sử dụng từ khóa global để thay đổi giá trị của biến toàn cục trong một hàm.

3. Từ khoá global trong Python

Từ khoá global trong Python được sử dụng để thao tác với một biến toàn cục trong phạm vi của một hàm. Khi sử dụng từ khoá global chúng ta có thể tạo mới một biến toàn cục trong một hàm và sử dụng chúng ở tất cả phạm vi toàn cục. Từ khoá global trong Python cũng giúp ta thực hiện việc thay đổi giá trị của một biến toàn cục khi sử dụng biến toàn cục đó trong một hàm.

Ví dụ dưới đây, sử dụng từ khoá global để thực hiện tạo mới một biến toàn cục trong hàm def tinhtong() như sau:

# Khai bao ham
def tinhtong():
    # Khai bao bien toan cuc y voi tu khoa global
    global y
    y = 25

# Goi ham tinhtong()
tinhtong()

# Hien thi y ben ngoai ham tinhtong()
print("Gia tri y ben ngoai ham tinhtong() la: {0}".format(y))

Kết quả:

Gia tri y ben ngoai ham tinhtong() la: 25

Ở ví dụ trên, mặc dù biến y không được khai báo bên ngoài hàm def tinhtong() nhưng vẫn được sử dụng như một biến toàn cục là do việc sử dụng từ khoá global y trong hàm def tinhtong(). Và khi biến y được coi là biến toàn cục thì ta hoàn toàn có thể sử dụng bên ngoài hàm def tinhtong().

Ví dụ tiếp theo, sử dụng từ khoá global để thực hiện thay đổi giá trị của một biến toàn cục đã được khai báo trước và sử dụng trong hàm def tinhtong() như sau:

# Khai bao bien toan cuc y
y = 10

# Hien thi gia tri y ban dau
print("Gia tri y ban dau la: {0}".format(y))

# Khai bao ham
def tinhtong():
    # Khai bao bien toan cuc y
    global y
    y = 20 # Thay doi gia tri bien toan cuc y trong ham tinhtong()

# Goi ham tinh tong de thuc hien thay doi gia tri y
tinhtong()

# Hien thi gia tri y sau khi thay doi gia tri trong ham tinhtong()
print("Gia tri y sau khi thay doi: {0}".format(y))

Kết quả:

Gia tri y ban dau la: 10
Gia tri y sau khi thay doi: 20