Bài này sẽ giải thích một chút về biến toàn cục và biến cục bộ trong Python để bạn hiểu phạm vi hoạt động của chúng, tránh được những lỗi ngớ ngẩn không hiểu tại sao có khai báo biến mà vẫn bị lỗi.
1. Biến toàn cục là gì?
Trong Python, một biến được khai báo bên ngoài hàm hoặc trong phạm vi toàn cục được gọi là biến toàn cục. Điều này có nghĩa, biến toàn cục có thể được truy cập bên trong hoặc bên ngoài hàm.
Biến toàn cục có tên gọi là Global Variable.
Hãy xem một ví dụ về cách tạo một biến toàn cục trong Python.
1
2
3
4
5
6
7
|
x = "global" def foo(): print ( "x inside :" , x) foo() print ( "x outside:" , x) |
Khi chạy chương trình này thì kết quả sẽ như sau:
1
2
|
x inside : global x outside: global |
Trong đoạn code trên thì biến x là biến toàn cục bởi nó được khai báo bên ngoài hàm, nằm tại vị trí cấp cao nhất của ứng dụng. Giống như Javascript, trong hàm có thể sử dụng biến cục bộ mà không cần phải thông qua việc truyền tham số.
Chuyện gì sảy ra nếu bạn cố tình thay đổi giá trị của x bên trong hàm foo()?
1
2
3
4
5
6
|
x = "global" def foo(): x = x * 2 print (x) foo() |
Khi chạy chương trình thì sẽ bị lỗi như sau:
1
|
UnboundLocalError: local variable 'x' referenced before assignment |
Lý do tại sao? Tại vì bên trong hàm foo()
bạn đã thay đổi giá trị cho biến x
nên mặc nhiên nó sẽ hiểu biến x
là biến cục bổ, mà biến cục bộ thì đoạn code x = x * 2
sẽ sai vì biến x
chưa được khai báo.
2. Biến cục bộ là gì?
Trong Python biến cục bộ được hiểu là biến được khai báo bên trong hàm hoặc phạm vi cục bộ, những biến này gọi là biến cục bộ.
Biến cục bộ có tên gọi là Local Variable.
Hãy xem ví dụ dưới đây:
1
2
3
4
5
|
def foo(): y = "local" foo() print (y) |
Do biến y là biến cục bộ nằm bên trong hàm foo()
nên đoạn codeprint(y)
là sai, bạn không thể sử dụng biến cục bộ ở bên ngoài hàm được.
Chạy lên kết quả sẽ như sau:
1
|
NameError: name 'y' is not defined |
3. Từ khóa global
Để tường minh trong việc sử dụng biến cục bộ ở trong hàm thì Python cung cấp từ khóa global, khi khai báo từ khóa nào cho một biến bất kì thì trình biên dịch sẽ tự hiểu biến đó sẽ trỏ tới một biến cục bộ nằm bên ngoài hàm.
Ví dụ: Sử dụng từ khóa global
1
2
3
4
5
6
7
8
9
10
|
x = "global" def foo(): global x y = "local" x = x * 2 print (x) print (y) foo() |
Chạy lên kết quả sẽ như sau:
1
2
|
global global local |
Nếu ở ví dụ ở phần 1 bị sai vì ta đã thay đổi giá trị cho biến x
thì trong ví dụ này lại đúng, tại sao? Tại vì ta đã sử dụng từ khóa global
để trỏ đến biến cục bộ bên ngoài.
4. Lời kết
Khó khăn nhất là việc khai báo trùng tên ở biến toàn cục và biến cục bộ, vì vậy lời khuyên bạn nên sử dụng biến một cách khoa học, khai báo bằng tham số truyền vào nếu muốn sử dụng biến toàn cục ở bên trong hàm.
Như vậy là mình đã giới thiệu xong khái niệm về biến cục bộ và biến toàn cục trong Python, hy vọng bạn sẽ hiểu ý nghĩa của từng loại biến để sử dụng cho đúng mục đích.
Nguồn:https://freetuts.net