Câu hỏi: Đoạn chương trình sau có lỗi không? Nếu không, kết quả lệnh print()
sẽ in ra số nào?
def f(x,y):
n = x + y
m = x - y
return 2*n* (m+1)
n = 5
m = 3
f(2,1)
print(n, m)
Phân tích đoạn chương trình:
Đoạn chương trình trên định nghĩa một hàm f(x, y)
và sau đó gọi hàm này với các giá trị cụ thể. Điều quan trọng cần hiểu là phạm vi của các biến.
- Định nghĩa hàm
f(x, y)
:- Hàm này nhận hai tham số
x
vày
. - Bên trong hàm,
n
được gán bằngx + y
vàm
được gán bằngx - y
. - Hàm trả về giá trị
2*n* (m+1)
.
- Hàm này nhận hai tham số
- Biến toàn cục:
n = 5
vàm = 3
định nghĩa hai biếnn
vàm
trong phạm vi toàn cục (global scope).
- Gọi hàm
f(2, 1)
:- Hàm
f
được gọi vớix = 2
vày = 1
. Các biếnn
vàm
bên trong hàm là các biến cục bộ, khác với các biến toàn cụcn
vàm
. - Kết quả trả về từ hàm
f(2, 1)
không được gán cho bất kỳ biến nào, do đó nó bị bỏ qua.
- Hàm
- Lệnh
print(n, m)
:- Lệnh này in giá trị của các biến
n
vàm
trong phạm vi toàn cục. Vì các biến này không bị thay đổi bởi việc gọi hàmf(2, 1)
, chúng vẫn giữ giá trị ban đầu là 5 và 3.
- Lệnh này in giá trị của các biến
Kết quả:
Đoạn chương trình trên không có lỗi. Lệnh print(n, m)
sẽ in ra:
5 3
Giải thích chi tiết hơn:
Điểm mấu chốt ở đây là sự khác biệt giữa biến cục bộ và biến toàn cục. Khi bạn định nghĩa một biến bên trong một hàm (như n
và m
trong hàm f
), nó là một biến cục bộ chỉ tồn tại và có giá trị trong phạm vi của hàm đó. Khi hàm kết thúc, các biến cục bộ này bị hủy.
Các biến n = 5
và m = 3
được định nghĩa bên ngoài hàm f
, do đó chúng là các biến toàn cục. Chúng có thể được truy cập từ bất kỳ đâu trong chương trình (trừ khi bị che khuất bởi một biến cục bộ có cùng tên).
Khi bạn gọi f(2, 1)
, hàm sẽ thực thi, tính toán một giá trị, và trả về giá trị đó. Tuy nhiên, vì bạn không gán giá trị trả về này cho bất kỳ biến nào, nó sẽ bị bỏ qua. Hàm f(2,1)
không sửa đổi các biến toàn cục n
và m
. Do đó, khi bạn in n
và m
, bạn in các giá trị toàn cục của chúng, là 5 và 3.
Tóm tắt:
Để hiểu rõ hơn về cách đoạn chương trình hoạt động, hãy xem xét các bước sau:
- Định nghĩa hàm
f(x, y)
. - Gán
n = 5
vàm = 3
(biến toàn cục). - Gọi hàm
f(2, 1)
(tính toán nhưng không lưu kết quả). - In giá trị của
n
vàm
(các biến toàn cục, vẫn là 5 và 3).
Hiểu rõ về phạm vi biến là rất quan trọng trong lập trình để tránh các lỗi không mong muốn và đảm bảo chương trình hoạt động đúng như dự kiến. Việc nắm vững kiến thức này giúp bạn dễ dàng hơn trong việc phân tích và sửa lỗi các đoạn chương trình phức tạp.