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ộ và 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.