Biến toàn cục (global), biến cục bộ (local), biến nonlocal trong Python
Biến toàn cục Python không phải là duy nhất. Hãy cùng nhau tìm hiểu các biến cục bộ, biến toàn cục trong Python được sử dụng như thế nào nhé!
Biến trong Python là gì?
Biến trong Python là các container lưu trữ giá trị dữ liệu. Python không có lệnh cho khai báo biến. Một biến được tạo ra vào lần đầu tiên bạn gán một giá trị cho nó. Ví dụ:
x = 5
y = "John"
print(x)
print(y)
Biến không cần được khai báo với bất kỳ kiểu type, và thậm chí có thể thay đổi kiểu sau khi thiết lập chúng.
x = 4 # x là một kiểu int
x = "Sally" # x giờ là kiểu str
print(x)
Nếu muốn xác định kiểu dữ liệu của một biến, bạn có thể áp dụng phương pháp ép kiểu như ví dụ sau:
x = str(3) # x sẽ là '3'
y = int(3) # y sẽ là 3
z = float(3) # z sẽ là 3.0
Xác định kiểu biến trong Python
Bạn có thể lấy kiểu dữ liệu của một biến bằng hàm type()
. Ví dụ:
x = 5
y = "John"
print(type(x))
print(type(y))
Giờ chúng ta sẽ đi sâu vào tìm hiểu biến toàn cục (global), cục bộ (local) và nonlocal trong Python.
Biến toàn cục trong Python
Mục đích của biến toàn cục trong Python?
Từ khóa global (toàn cục) cho phép người dùng chỉnh sửa một biến nằm ngoài phạm vi hiện tại của nó. Nó được dùng để tạo các biến toàn cục trong Python từ phạm vi không phải biến toàn cục, ví dụ: bên trong một hàm. Từ khóa toàn cục được dùng bên trong một hàm chỉ khi bạn muốn thực hiện các phép gán hoặc khi muốn thay đổi một biến. Toàn cục không cần cho việc in và truy cập.
Những quy tắc dùng biến toàn cục mà bạn cần nhớ:
- Nếu một biến được gắn cho một giá trị tại vị trí bất kỳ bên trong phần nội dung của hàm, nó được xem là biến cục bộ trừ khi được khai báo rõ ràng là biến toàn cục.
- Biến chỉ được tham chiếu bên trong một hàm là biến toàn cục.
- Từ khóa global dùng biến toàn cục bên trong một hàm.
- Không cần dùng từ khóa global bên ngoài hàm.
Hãy xem ví dụ về cách tạo biến toàn cục trong Python.
#Khai báo biến x:
x = "Biến toàn cục"
#Gọi x từ trong hàm vidu()
def vidu():
print("x trong hàm vidu() :", x)
vidu()
#Gọi x ngoài hàm vidu()
print("x ngoài hàm vidu():", x)
Trong ví dụ trên, ta khai báo biến x là biến toàn cục, và định nghĩa hàm vidu()
để in biến x. Cuối cùng ta gọi hàm vidu()
để in giá trị của biến x
. Chạy code trên ta sẽ được kết quả là:
x trong hàm vidu(): Biến toàn cục
x ngoài hàm vidu(): Biến toàn cục
Chuyện gì sẽ xảy ra nếu bạn thay đổi giá trị của x trong hàm?
x = 2
def vidu():
x=x*2
print(x)
vidu()
Nếu chạy code này bạn sẽ nhận được thông báo lỗi:
UnboundLocalError: local variable 'x' referenced before assignment
Lỗi này xuất hiện là do Python xử lý x
như một biến cục bộ và x
không được định nghĩa trong vidu()
.
Để thay đổi biến toàn cục trong một hàm bạn sẽ phải sử dụng từ khóa global. Chúng tôi sẽ nói kỹ hơn trong bài về từ khóa global.
Biến cục bộ trong Python
Biến được khai báo bên trong một hàm hoặc trong phạm vi cục bộ được gọi là biến cục bộ hay biến local.
def vidu():
y = "Biến cục bộ"
vidu()
print(y)
Khi chạy code trên bạn sẽ nhận được thông báo lỗi:
NameError: name 'y' is not defined
Lỗi này xuất hiện là do chúng ta đã cố truy cập vào biến cục bộ y trong phạm vi toàn cục, nhưng y chỉ làm việc trong hàm vidu()
hoặc phạm vi cục bộ.
Thông thường, để tạo một biến cục bộ, chúng ta sẽ khai báo nó trong một hàm như ví dụ dưới đây:
def vidu():
y = "Biến cục bộ"
print(y)
vidu()
Chạy code trên ta sẽ được kết quả
Biến cục bộ
Chúng ta quay trở lại xem xét vấn đề trước đó, lúc x
là một biến toàn cục và chúng ta muốn thay đổi x
trong vidu()
.
Biến cục bộ và biến toàn cục
Ở đây, chúng ta sẽ học cách dùng biến cục bộ và toàn cục trong cùng một code.
x = 2
def vidu():
global x
y = "Biến cục bộ"
x = x * 2
print(x)
print(y)
#Viết bởi Quantrimang.com
vidu()
Chạy code trên ta sẽ có đầu ra:
4
Biến cục bộ
Trong code trên, chúng ta khai báo x
là biến toàn cục và y
là biến cục bộ trong vidu()
và dùng toán tử * để thay đổi biến toàn cục và in cả giá trị của x và y. Sau khi gọi hàm vidu()
giá trị của x sẽ thành 4 vì được nhân đôi.
Ví dụ sử dụng biến toàn cục và cục bộ trùng tên:
x = 5
def vidu():
x = 10
print("Biến x cục bộ:", x)
vidu()
print("Biến x toàn cục:", x)
Sau khi chạy code trên ta có đầu ra:
Biến x cục bộ: 10
Biến x toàn cục: 5
Trong code trên, chúng ta sử dụng cùng tên x cho cả biến cục bộ và biến toàn cục. Khi in cùng biến x chúng ta nhận được hai kết quả khác nhau vì biến được khai báo ở cả hai phạm vi, cục bộ (bên trong hàm vidu()
) và toàn cục (bên ngoài hàm vidu()
).
Khi chúng ta in biến trong hàm vidu()
nó sẽ xuất ra Biến x cục bộ: 10
, đây được gọi là phạm vi cục bộ của biến. Tương tự khi ta in biến bên ngoài hàm vidu()
sẽ cho ra Biến x toàn cục: 5
, đây là phạm vi toàn cục của biến.
Biến nonlocal trong Python
Từ nonlocal này mình không biết dịch sang tiếng Việt sao cho chuẩn. Trong Python, biến nonlocal được sử dụng trong hàm lồng nhau nơi mà phạm vi cục bộ không được định nghĩa. Nói dễ hiểu thì biến nonlocal không phải biến local, không phải biến global, bạn khai báo một biến là nonlocal khi muốn sử dụng nó ở phạm vi rộng hơn local, nhưng chưa đến mức global.
Để khai báo biến nonlocal ta cần dùng đến từ khóa nonlocal.
Ví dụ:
def ham_ngoai():
x = "Biến cục bộ"
def ham_trong():
nonlocal x
x = "Biến nonlocal"
print("Bên trong:", x)
ham_trong()
print("Bên ngoài:", x)
hamngoai()
Chạy code trên bạn sẽ có đầu ra:
Bên trong: Biến nonlocal
Bên ngoài: Biến nonlocal
Trong code trên có một hàm lồng là ham_trong()
, ta dùng từ khóa nonlocal
để tạo biến nonlocal. Hàm ham_trong()
được định nghĩa trong phạm vi của ham_ngoai()
.
Lưu ý: Nếu chúng ta thay đổi giá trị của biến nonlocal, sự thay đổi sẽ xuất hiện trong biến cục bộ.
Đừng quên làm bài tập Python bạn nhé.
Bạn nên đọc
- Nguyễn BảoThích · Phản hồi · 1 · 05/11/22
- Nguyễn Hữu ThươngThích · Phản hồi · 0 · 02/07/22
Cũ vẫn chất
-
7 cách sửa lỗi "Compressed (Zipped) Folder Is Invalid" trên Windows
Hôm qua -
Cách khắc phục lỗi PXE-E61: Media Test Failure, Check Cable
Hôm qua -
Cách sửa lỗi Android Auto không hoạt động
Hôm qua -
Thật đáng sợ, AI có thể tạo ra khuôn mặt chính xác chỉ từ giọng nói của một người
Hôm qua -
Lời chúc Giáng sinh cho người yêu lãng mạn, chúc Noel người yêu ngọt ngào
Hôm qua -
Hướng dẫn toàn tập Word 2016 (Phần 1): Làm quen với giao diện Ribbon
Hôm qua -
Lỗi không thể kết nối iTunes Store, đây là cách khắc phục
Hôm qua 1 -
Cách thu hồi email đã gửi trong Gmail
Hôm qua -
Hướng dẫn sửa lỗi WinRAR diagnostic messages, file nén tải về bị lỗi
Hôm qua 1 -
Cách xem phim mới, phim hay trực tuyến
Hôm qua 1