Skip to main content

Bài 17 - Từ Khóa global Trong Python

Mục tiêu: Hiểu rõ cách sử dụng từ khóa global để quản lý biến toàn cục trong hàm.

1. Giới Thiệu

  • Vấn đề: Khi một biến toàn cục (global) được khai báo bên ngoài hàm, bạn không thể thay đổi giá trị của nó trực tiếp bên trong hàm.
  • Giải pháp: Từ khóa global cho phép hàm:
    • Truy cập biến toàn cục
    • Sửa đổi giá trị của biến toàn cục

2. Khi Nào Cần Dùng global?

ScenarioCần global?Ví dụ
Chỉ đọc giá trị biến global❌ Khôngprint(x)
Gán lại giá trị biến global✅ Cóx = new_value
Thay đổi object mutable (list, dict)❌ Không (*)list.append(1)

(*) Với mutable objects, bạn có thể thay đổi nội dung mà không cần global, nhưng không thể gán lại cả biến.

3. Cú Pháp Cơ Bản

global variable_name  # Khai báo ở đầu hàm

Ví dụ minh họa:

counter = 0  # Biến toàn cục

def increment():
    global counter  # Khai báo sử dụng biến toàn cục
    counter += 1

increment()
print(counter)  # Output: 1

4. So Sánh Không/Có global

Tình huống 1: Không dùng global → Tạo biến local mới

x = 10

def func():
    x = 20  # Tạo biến local x, KHÔNG ảnh hưởng global x

func()
print(x)  # Output: 10 (giá trị global không đổi)

Tình huống 2: Dùng global → Thay đổi biến toàn cục

x = 10

def func():
    global x
    x = 20  # Sửa biến global x

func()
print(x)  # Output: 20 (giá trị global đã thay đổi)

5. Lưu ý Quan Trọng

  1. Khai báo trước khi gán: Luôn đặt global ở đầu hàm, trước mọi thao tác với biến.

    def valid():
        global x
        x = 10  # Đúng
    
    def invalid():
        x = 10
        global x  # Lỗi: SyntaxError
  2. Biến chưa tồn tại: global có thể tạo biến mới trong global scope nếu chưa có:

    def create_global():
        global new_var
        new_var = 100  # Tạo biến global mới
    
    create_global()
    print(new_var)  # Output: 100
  3. Tránh lạm dụng:
    • Sử dụng quá nhiều biến global → code khó debug, dễ gây xung đột
    • Ưu tiên truyền tham số và trả về giá trị thay vì dùng global

6. Bài Tập Thực Hành

Câu 1: Đoán output

total = 0

def calculate():
    global total
    total = 15
    partial = 5  # Biến local

calculate()
print(total)  # Output: ?
print(partial)  # Output: ?

<details> <summary>Đáp án</summary> total = 15 (global được sửa)<br> partial → Lỗi NameError (biến local không tồn tại bên ngoài hàm) </details>

Câu 2: Sửa lỗi

balance = 100

def withdraw(amount):
    balance = balance - amount  # Lỗi!

withdraw(20)

Sửa

balance = 100

def withdraw(amount):
    global balance
    balance = balance - amount  # Đúng

withdraw(20)
print(balance)  # Output: 80

7. Tài Nguyên Học Tập

Chúc bạn làm chủ từ khóa global