SCOPES – Phạm vi biến trong hàm

1. Khái niệm Scope (Phạm vi biến)

Scope là phạm vi mà một biến “tồn tại” và có thể được sử dụng. Có hai loại scope quan trọng: Global Scope và Local Scope.

1.1. Global Scope – Phạm vi toàn cục

  • Biến được khai báo ngoài hàm.
  • Có thể được truy cập bởi mọi hàm trong file Python.
  • Có thể nằm ở file khác nhưng được import.

1.2. Local Scope – Phạm vi cục bộ

  • Biến được khai báo bên trong hàm.
  • Chỉ tồn tại trong hàm đó.
  • Bên ngoài hàm sẽ không nhìn thấy biến này.

2. Ví dụ về Global và Local Variables

Global variables

name_of_units = "minutes"
num_of_units = 24 * 60   # global

Local variable trong hàm

def days_to_units(number_of_days):
    # number_of_days là local variable
    return number_of_days * num_of_units

3. Minh hoạ lỗi khi truy cập sai scope

Transcript mô tả trường hợp hàm cố gắng dùng biến không thuộc phạm vi của nó.

Ví dụ lỗi:

name_of_units = "minutes"
num_of_units = 1440   # biến toàn cục

def days_to_units(number_of_days):
    result = number_of_days * num_of_units
    return result

def scope_check():
    print(name_of_units)      # OK: global variable
    print(number_of_days)     # ❌ lỗi: không tồn tại trong hàm này

Kết quả khi chạy scope_check():

NameError: name 'number_of_days' is not defined

Giải thích:

  • name_of_units: global → hàm nào cũng nhìn thấy
  • number_of_days: local của days_to_units() → hàm scope_check() không biết nó tồn tại

4. Tạo biến trùng tên nhưng thuộc phạm vi khác nhau

Transcript nói rằng nếu biến local của hàm A không tồn tại trong hàm B, bạn có thể tạo biến cùng tên mà không xung đột.

Ví dụ:

def days_to_units(number_of_days):
    result = number_of_days * num_of_units
    return result

def scope_check(number_of_days):
    # biến local number_of_days này KHÔNG liên quan tới hàm trên
    print("Value inside scope_check:", number_of_days)

→ Hai biến number_of_dayskhác nhau, dù tên giống nhau.

5. Ví dụ đầy đủ theo transcript

Dưới đây là phiên bản “sạch” và hoàn chỉnh dựa trên nội dung bạn cung cấp:

# Global variables
name_of_units = "minutes"
num_of_units = 24 * 60  # 1440

def days_to_units(number_of_days):
    # local variable
    my_variable_inside_function = "Inside function only"

    print(f"Global variable: {name_of_units}")
    print(f"Parameter variable: {number_of_days}")
    print(f"Internal variable: {my_variable_inside_function}")

    result = number_of_days * num_of_units
    print(f"{number_of_days} days = {result} {name_of_units}")


def scope_check(value):
    print("Accessing global variable:", name_of_units)  # OK
    print("Parameter value:", value)                    # OK

    # number_of_days không tồn tại trong hàm này
    # print(number_of_days) -> sẽ gây lỗi nếu bật dòng này

Gọi thử:

days_to_units(5)
scope_check(20)

Output minh hoạ:

Global variable: minutes
Parameter variable: 5
Internal variable: Inside function only
5 days = 7200 minutes

Accessing global variable: minutes
Parameter value: 20

6. Các điểm quan trọng (Bullet Points)

Global Variables

  • Khai báo bên ngoài hàm
  • Truy cập được bởi mọi hàm
  • Nguy hiểm nếu lạm dụng vì dễ gây lỗi logic
  • Dùng khi giá trị mang tính “hằng số” như:
    • số phút trong một ngày
    • đơn vị chuyển đổi
    • cấu hình chương trình

Local Variables

  • Tạo bên trong hàm
  • Chỉ tồn tại trong phạm vi hàm
  • Không thể truy cập từ ngoài
  • Tên có thể trùng với biến global mà không ảnh hưởng lẫn nhau

Parameter (tham số) = Local Variable đặc biệt

  • Nhận giá trị từ bên ngoài
  • Chỉ tồn tại trong hàm
  • Mỗi lần gọi hàm, giá trị thay đổi

7. Ví dụ minh họa đơn giản bằng tiếng Việt

Ví dụ minh hoạ phạm vi biến như trong hội thoại đời thường

ten_quoc_gia = "Việt Nam"  # biến toàn cục

def gioi_thieu(ten):
    tuoi = 20  # biến cục bộ
    print(f"Tôi tên {ten}, {tuoi} tuổi, đến từ {ten_quoc_gia}")

def thong_bao():
    print(ten_quoc_gia)  # OK
    # print(tuoi)  # ❌ lỗi vì biến tuoi chỉ tồn tại trong hàm gioi_thieu()

Tóm tắt nhanh

Loại biếnĐịnh nghĩaTồn tại ở đâu?Ai truy cập được?
Globalngoài hàmtoàn chương trìnhtất cả hàm
Localtrong hàmchỉ trong hàm đóchỉ chính hàm đó
Parametertrong hàm (trong dấu ngoặc)mỗi lần gọi hàmchỉ trong hàm

Bài tập thực hành

Bài tập:

Viết hai hàm:

  1. tinh_tong(a, b)
    • trả về tổng hai số
    • khởi tạo thêm 1 biến local trong hàm
  1. kiem_tra_bien()
    • thử in ra biến local của hàm 1 (để xem lỗi)
    • in ra biến global