Biến toàn cục và biến cục bộ trong Python

Category: Python

Trong Python , biến toàn cục được khai báo bên ngoài bất kỳ hàm nào và có thể được truy cập ở bất kỳ đâu trong chương trình, bao gồm cả bên trong các hàm. Mặt khác, biến cục bộ được tạo bên trong một hàm và chỉ có thể truy cập trong quá trình thực thi của hàm đó. Điều này có nghĩa là biến cục bộ chỉ tồn tại bên trong hàm nơi chúng được định nghĩa và không thể được sử dụng bên ngoài hàm đó. Hãy cùng tìm hiểu chi tiết từng biến.

Biến cục bộ Python

Biến cục bộ được tạo trong một hàm và chỉ tồn tại trong quá trình thực thi hàm đó. Chúng không thể truy cập được từ bên ngoài hàm.

Ví dụ 1: Trong ví dụ này, chúng ta sẽ tạo và truy cập một biến cục bộ bên trong một hàm.

def greet():
    msg = "Hello from inside the function!"
    print(msg)

greet()

Đầu ra:

Hello from inside the function!

Giải thích: Chúng ta định nghĩa greet() với một biến cục bộ msg và in nó ra. Vì msg chỉ tồn tại trong quá trình thực thi hàm nên nó được truy cập trong hàm. Gọi greet() sẽ hiển thị thông báo.

Ví dụ 2 : Trong ví dụ này, chúng ta tạo một biến cục bộ bên trong một hàm rồi cố gắng truy cập nó bên ngoài hàm, điều này gây ra lỗi.

def greet():
    msg = "Hello!"
    print("Inside function:", msg)

greet()
print("Outside function:", msg)

Đầu ra:

Hangup (SIGHUP)
Traceback (most recent call last):
  File "/home/guest/sandbox/Solution.py", line 6, in <module>
    print("Outside function:", msg)
                               ^^^
NameError: name 'msg' is not defined

Giải thích: msg là biến cục bộ bên trong greet() và chỉ có thể truy cập được ở đó. In ra bên ngoài sẽ gây ra lỗi vì nó không tồn tại trên toàn cục.

Biến toàn cục của Python

Biến toàn cục được định nghĩa bên ngoài tất cả các hàm. Chúng có thể được truy cập và sử dụng ở bất kỳ phần nào của chương trình, bao gồm cả bên trong các hàm.

Ví dụ 1: Trong ví dụ này, chúng ta tạo một biến toàn cục và sau đó truy cập biến đó cả bên trong và bên ngoài một hàm.

msg = "Python is awesome!"

def display():
    print("Inside function:", msg)

display()
print("Outside function:", msg)

Đầu ra:

Inside function: Python is awesome!
Outside function: Python is awesome!

Giải thích: msg là một biến toàn cục có thể truy cập được cả bên trong và bên ngoài hàm display() . Gọi display() sẽ in ra msg toàn cục và việc in msg bên ngoài hàm sẽ diễn ra như mong đợi.

Ví dụ 2: Trong ví dụ này, chúng ta sẽ tạo một biến toàn cục và sử dụng nó cả bên trong và bên ngoài một hàm.

def fun():
    print("Inside Function", s)

# Phạm vi toàn cầu
s = "I love Geeksforgeeks"
fun()
print("Outside Function", s)

Đầu ra:

Inside Function I love Geeksforgeeks
Outside Function I love Geeksforgeeks

Giải thích: s là một biến toàn cục được truy cập và in ra bên trong fun() . Cả việc gọi fun() và in s bên ngoài đều hiển thị cùng một giá trị toàn cục.

Lưu ý: Vì không có biến cục bộ nên giá trị từ biến toàn cục sẽ được sử dụng nhưng hãy đảm bảo cả biến cục bộ và biến toàn cục đều có cùng tên.

Tại sao chúng ta sử dụng biến Local và Global trong Python?

Nếu một biến được định nghĩa cả toàn cục và cục bộ với cùng tên, biến cục bộ sẽ che khuất biến toàn cục bên trong hàm. Các thay đổi đối với biến cục bộ không ảnh hưởng đến biến toàn cục trừ khi bạn khai báo rõ ràng biến đó là toàn cục.

Ví dụ:

def fun():
    s = "Me too."
    print(s)

s = "I love Geeksforgeeks"
fun()   
print(s)

Đầu ra:

Me too.
I love Geeksforgeeks

Giải thích: Bên trong fun() , s là một biến cục bộ được đặt thành "Me too." và in ra giá trị đó. Bên ngoài, s toàn cục vẫn là "I love Geeksforgeeks", do đó, việc in s sau đó sẽ hiển thị giá trị toàn cục.

Sẽ thế nào nếu chúng ta thử sửa đổi một biến toàn cục bên trong một hàm?

Cố gắng thay đổi một biến toàn cục bên trong một hàm mà không khai báo nó là toàn cục sẽ gây ra lỗi.

Ví dụ:

def fun():
    s += 'GFG'  
    print("Inside Function", s)

s = "I love Geeksforgeeks"
fun()

Đầu ra:

UnboundLocalError: local variable 's' referenced before assignment

Giải thích: fun() cố gắng sửa đổi s mà không khai báo nó là toàn cục, do đó Python coi s là cục bộ nhưng nó được sử dụng trước khi gán, gây ra lỗi. Khai báo s là toàn cục bên trong fun() sẽ khắc phục lỗi này.

Sửa đổi các biến toàn cục bên trong một hàm

Để sửa đổi một biến toàn cục bên trong một hàm, bạn phải nói rõ với Python rằng bạn muốn sử dụng phiên bản toàn cục bằng cách sử dụng từ khóa global .

Ví dụ:

def fun():
    global s
    s += ' GFG'   # Sửa đổi biến toàn cục
    print(s)
    s = "Look for Geeksforgeeks Python Section"
    print(s)

s = "Python is great!"
fun()
print(s)

Đầu ra:

Python is great! GFG
Look for Geeksforgeeks Python Section
Look for Geeksforgeeks Python Section

Giải thích: Bên trong fun(), từ khóa global cho phép Python sửa đổi trực tiếp biến toàn cục s . Đầu tiên, hàm này thêm 'GFG' vào "Python thật tuyệt!", sau đó gán lại s vào "Look for Geeksforgeeks Python Section".

Ví dụ 2: Ví dụ này chứng minh cách Python xử lý các biến toàn cục và biến cục bộ có cùng tên và cách từ khóa global ảnh hưởng đến hành vi của chúng.

a = 1  # Biến toàn cục

def f():
    print('f():', a)  # Sử dụng biến toàn cục a

def g():
    a = 2  # Biến cục bộ che khuất biến toàn cục
    print('g():', a)

def h():
    global a
    a = 3  # Thay đổi biến toàn cục a
    print('h():', a)

print('global:', a)  
f()                  
print('global:', a) 
g()                 
print('global:', a)  
h()                  
print('global:', a)

Đầu ra:

global: 1
f(): 1
global: 1
g(): 2
global: 1
h(): 3
global: 3

Giải thích:

  • f() in ra giá trị toàn cục a mà không thay đổi nó.

  • g() tạo ra một a cục bộ làm mờ a toàn cục, giữ nguyên a toàn cục .

  • h() sử dụng global để sửa đổi a toàn cục.

  • Chỉ có h() thay đổi biến toàn cục, f()g() thì không.

Sự khác biệt giữa Biến cục bộ và Biến toàn cục

Hiểu được các biến cục bộ và toàn cục trong Python là chìa khóa, vì chúng khác nhau về phạm vi và thời gian tồn tại. Biến cục bộ tồn tại bên trong các hàm và biến toàn cục có thể truy cập ở mọi nơi. Kiến thức này giúp ngăn ngừa lỗi và viết mã sạch hơn. Xem bảng so sánh bên dưới để rõ hơn.

Cơ sở so sánh

Biến toàn cục

Biến cục bộ

Sự định nghĩa

Được khai báo bên ngoài các hàm

Được khai báo trong các hàm

Trọn đời

Chúng được tạo ra khi chương trình bắt đầu thực hiện và bị mất khi chương trình kết thúc

Chúng được tạo ra khi hàm bắt đầu thực thi và bị mất khi hàm kết thúc.

Chia sẻ dữ liệu

Cung cấp chia sẻ dữ liệu

Nó không cung cấp Chia sẻ dữ liệu

Phạm vi

Có thể truy cập trong toàn bộ mã

Chỉ có thể truy cập bên trong hàm

Các thông số cần thiết

Không cần thiết phải truyền tham số

Việc truyền tham số là cần thiết

Kho

 Một vị trí cố định được trình biên dịch chọn

Chúng được giữ trên ngăn xếp

Giá trị

Khi giá trị thay đổi, nó sẽ được phản ánh trong toàn bộ mã

một khi đã thay đổi biến không ảnh hưởng đến các chức năng khác của chương trình

Published on Jun 17, 2025