Tin Học KHMT
Ôn tập Tin học THPT › Tin học 10 › Bài 32
Tin học 10

Bài 32. Biến sống ở đâu: cục bộ, toàn cục và lệnh global

Cùng một cái tên biến, nhưng đặt trong hàm hay ngoài hàm lại cho ra hai kết quả khác hẳn nhau. Bài này giúp bạn phân biệt biến cục bộ với biến toàn cục, hiểu vì sao gán giá trị trong hàm thường không làm đổi biến bên ngoài, và khi nào thì cần đến lệnh global.

Chủ đề F · Lập trình, Thuật toán & CTDL (KHMT) - đọc khoảng 12 phút · 25 câu luyện tập trong ứng dụng

Tương ứng sách giáo khoa
  • Kết nối tri thứcTin học 10 - Bài 28. Phạm vi của biếntr. 136–140
Xem bảng đối chiếu cả bộ →

Bắt đầu bằng một hình dung

Lớp 10A đang chuẩn bị cho hội trại cuối năm. Cuối lớp có một tấm bảng phụ, trên đó lớp trưởng ghi to một dòng duy nhất: "Quỹ hội trại: 500 nghìn". Ai đi ngang cũng đọc được con số ấy, và cả lớp đều lấy nó làm căn cứ khi bàn bạc.

Hôm sau, tổ 1 họp riêng để tính chuyện mua nước và bánh. Bạn tổ trưởng lấy cuốn sổ nháp của tổ mình ra, viết vào đó: "Quỹ hội trại: 300 nghìn" - vì tổ chỉ được giao quản một phần tiền. Họp xong, cả tổ giải tán, cuốn sổ nháp được gấp lại cất vào cặp. Điều thú vị là: dòng chữ trên tấm bảng phụ cuối lớp vẫn nguyên vẹn "500 nghìn", chẳng suy suyển gì.

Tổ 2 họp sau đó cũng làm y hệt: mở sổ nháp riêng của tổ mình, cũng viết một dòng tên y chang "Quỹ hội trại", nhưng ghi con số khác. Hai cuốn sổ nháp nằm trong hai cái cặp khác nhau, chẳng cuốn nào đè lên cuốn nào, và cũng chẳng cuốn nào chạm được tới tấm bảng chung.

Muốn con số trên tấm bảng phụ thật sự thay đổi, phải có người cầm bút, đi tới tận nơi, xoá số cũ và viết số mới lên bảng - một hành động rõ ràng, ai cũng nhìn thấy. Chuyện tưởng như vụn vặt này lại chính là quy tắc mà Python dùng để quản lí các cái tên trong chương trình, và nếu không nắm được nó, bạn sẽ đoán sai kết quả của rất nhiều đoạn chương trình có hàm.

Nội dung bài học

  1. 1) Biến sinh ra bên trong hàm chỉ sống khi hàm đang chạy
  2. 2) Biến toàn cục: hàm đọc được, nhưng gán vào lại là chuyện khác
  3. 3) Lệnh global - mở khoá để hàm sửa được biến toàn cục

Tóm tắt lý thuyết cần nhớ

  • Biến cục bộ là biến tạo ra bên trong thân hàm, kể cả các tham số: nó chỉ tồn tại trong lúc hàm chạy và gọi tên nó từ ngoài hàm sẽ gây lỗi NameError.
  • Biến toàn cục khai báo ở ngoài mọi hàm; hàm đọc được giá trị của nó, nhưng chỉ cần trong hàm có một lệnh gán cho tên đó là Python lập tức tạo ra một biến cục bộ mới tách rời hẳn.
  • Gán cho tên trùng biến toàn cục ở trong hàm không làm thay đổi biến toàn cục - chạy xong hàm, giá trị bên ngoài vẫn nguyên như cũ.
  • Lệnh global ten_bien đặt ở đầu thân hàm cho phép hàm sửa thật biến toàn cục, nhưng nên hạn chế dùng và thay bằng cách truyền tham số vào rồi lấy kết quả qua return.

Thuật ngữ tiếng Anh trong bài

Tiếng AnhĐọc làNghĩa
variableVE-ri-ơ-bồbiến
Một cái hộp có tên, dùng để chứa một giá trị.
functionPHẮNG-sầnhàm
Một 'cỗ máy nhỏ' lắp sẵn để làm một việc cụ thể.

Câu hỏi trắc nghiệm có đáp án

Mấy câu mẫu để bạn tự kiểm tra ngay. Trong ứng dụng, bài này có đủ 25 câu, chấm điểm tự động và giải thích từng câu sai.

Câu 1 · Nhận biết
Một biến được tạo ra bên trong thân hàm tồn tại trong khoảng thời gian nào?
  1. Từ lúc chương trình bắt đầu cho đến khi chương trình kết thúc.
  2. Chỉ trong lúc hàm đang chạy; hàm kết thúc thì biến đó cũng mất.
  3. Chỉ tồn tại nếu hàm có lệnh return, còn không thì bị bỏ qua.
  4. Tồn tại cho đến khi có một hàm khác gán lại giá trị cho tên đó.
Đáp án: B - Đáp án đúng là B: biến tạo ra trong thân hàm là biến cục bộ, Python chỉ dựng nó lên khi hàm được gọi và xoá đi ngay khi hàm kết thúc. A sai vì đó là mô tả của biến toàn cục - biến khai báo ở ngoài mọi hàm mới sống suốt chương trình. C sai vì sự tồn tại của biến cục bộ không liên quan gì đến việc hàm có return hay không; return chỉ quyết định hàm gửi kết quả nào ra ngoài. D sai vì các hàm khác không hề nhìn thấy biến cục bộ này, chúng có gán trùng tên thì cũng là tạo biến cục bộ của riêng chúng.
Câu 2 · Nhận biết
Sau khi một hàm đã chạy xong, ở ngoài hàm ta dùng print với tên một biến chỉ được tạo ra bên trong thân hàm đó. Điều gì xảy ra?
  1. Chương trình báo lỗi NameError vì ở ngoài hàm không có cái tên đó.
  2. Chương trình in ra giá trị cuối cùng mà biến đó nhận được trong hàm.
  3. Chương trình in ra 0, vì biến đã bị xoá nên tự trở về giá trị mặc định.
  4. Chương trình in ra None, giống như khi gọi một hàm không có return.
Đáp án: A - Đáp án đúng là A: biến cục bộ đã bị xoá khi hàm kết thúc, nên ở phạm vi ngoài hàm cái tên đó chưa từng tồn tại và Python báo NameError. B sai vì Python không giữ lại giá trị cuối của biến cục bộ để dùng tiếp bên ngoài - đó chính là điểm khác biệt cơ bản giữa biến cục bộ và biến toàn cục. C sai vì Python không có chuyện tự gán 0 cho một tên không tồn tại; muốn có giá trị 0 thì phải viết lệnh gán rõ ràng. D sai vì None là giá trị mà một lời gọi hàm không có return trả về, còn ở đây ta đang in một tên biến chứ không phải in kết quả gọi hàm.
Câu 3 · Thông hiểu
Cho đoạn chương trình sau. Chương trình in ra gì?
diem = 8

def sua_diem():
    diem = 10

sua_diem()
print(diem)
  1. 10
  2. 18
  3. Báo lỗi vì trong hàm không được đặt tên biến trùng với biến ở ngoài.
  4. 8
Đáp án: D - Đáp án đúng là D - in ra 8. Trong thân hàm có lệnh gán cho tên diem nhưng không khai báo global, nên Python coi diem trong hàm là một biến cục bộ mới hoàn toàn; nó nhận giá trị 10 rồi biến mất khi hàm kết thúc, còn biến toàn cục diem ở ngoài chưa hề bị đụng tới nên vẫn là 8. A sai vì đây chính là hiểu lầm phổ biến nhất: thấy lệnh gán trong hàm liền tưởng biến toàn cục đã đổi. B sai vì trong chương trình không có phép cộng nào giữa 8 và 10. C sai vì Python hoàn toàn cho phép đặt tên biến cục bộ trùng với biến toàn cục, hai biến đó chỉ đơn giản là tách rời nhau.
Câu Đúng/Sai (Phần II) · Thông hiểu
Cho biết mỗi phát biểu sau đúng hay sai:
  • a)Tham số của hàm cũng là một biến cục bộ, chỉ tồn tại trong lúc hàm đang chạy.Đúng
  • b)Một hàm không thể đọc được giá trị của biến toàn cục nếu không khai báo global.Sai
  • c)Nếu trong thân hàm có lệnh gán cho một tên trùng biến toàn cục mà không khai báo global, thì sau khi hàm chạy xong giá trị của biến toàn cục vẫn giữ nguyên.Đúng
  • d)Hai hàm khác nhau không được đặt trùng tên biến cục bộ, vì như vậy chúng sẽ ghi đè giá trị của nhau.Sai
Vì sao:
  • (a) Đúng - tham số được tạo ra khi hàm nhận đối số và bị xoá cùng các biến cục bộ khác lúc hàm kết thúc, nên gọi tên tham số ở ngoài hàm sẽ gây lỗi NameError.
  • (b) Sai - hàm luôn đọc được biến toàn cục mà không cần khai báo gì; global chỉ cần khi hàm muốn GÁN giá trị mới cho biến toàn cục đó.
  • (c) Đúng - lúc này Python coi tên đó là biến cục bộ mới của riêng hàm, biến toàn cục cùng tên không hề bị chạm tới nên giá trị bên ngoài không đổi.
  • (d) Sai - mỗi lần gọi hàm có khu làm việc riêng, nên hai hàm dùng trùng tên biến cục bộ vẫn hoạt động độc lập; chính nhờ vậy mà các hàm viết riêng lẻ có thể ghép chung vào một chương trình mà vẫn chạy đúng.

Thử ngay: minh hoạ từng bước

Bấm từng bước để tự xem cơ chế hoạt động, hoặc bấm “Tự chạy” cho nó tiến mỗi giây một lần. Đổi được dữ liệu đầu vào - không cần đăng nhập.

Học trọn bài này trong ứng dụng

Bài giảng đầy đủ, 25 câu luyện tập chấm tự động, thi thử đúng cấu trúc đề tốt nghiệp (24 trắc nghiệm + 4 Đúng/Sai), bài thực hành máy tự chấm và gia sư AI giải thích chỗ sai.

Mở bài 32 trong ứng dụng

Phần học miễn phí, không cần tạo tài khoản.