Tên được gán trong hàm là cục bộ
`so` bên trong hàm dưới đây là một tên cục bộ. Nó trùng chữ với `so` bên ngoài nhưng là chỗ gán khác:
```python
so = 10
def tang(so):
so = so + 1
return so
print(tang(4))
print(so)
```
Kết quả là `5` rồi `10`. Lời gọi đưa 4 vào tham số cục bộ, tăng thành 5 và trả về; biến ngoài vẫn giữ 10. Với số nguyên, gán lại tham số không làm biến của nơi gọi thay đổi.
Bài luyện
Mã `tang(4)` trong bài in hai dòng nào?
Tham số cục bộ thành 5, tên ngoài vẫn 10.
Tên ngoài không bị gán lại.
Hàm nhận 4 chứ không nhận 10.
Hàm tăng 4 trước khi trả.
Lời giải
`tang(4)` trả 5 từ tham số cục bộ; `so` ngoài hàm chưa đổi nên vẫn là 10.
Đọc tên ngoài khác với gán lại tên đó
Nếu trong hàm chỉ **đọc** tên ngoài, Python có thể tìm giá trị đó ở phạm vi ngoài:
```python
phi = 3
def tong_phi(gia):
return gia + phi
print(tong_phi(7))
```
Kết quả là `10`. Ở đây hàm không gán `phi`, nên đọc giá trị 3 bên ngoài. Để bài toán ít phụ thuộc vào trạng thái ngoài, thường rõ hơn khi đưa `phi` thành tham số riêng. Nếu một hàm gán tên `phi` mà không khai báo `global`, Python coi tên được gán đó là cục bộ; không thể đọc nó trước lần gán trong hàm.
Bài luyện
Với `phi = 3`, `tong_phi(7)` trả gì?
Phi là một phần của tổng.
Gia là 7 nhưng còn cộng phi.
7+3=10; hàm chỉ đọc phi ngoài.
phi đã được định nghĩa trước lời gọi.
Lời giải
Hàm lấy gia=7 và đọc phi=3 từ phạm vi ngoài; trả `7+3=10`.
Bài luyện
Vì sao `so` ngoài hàm vẫn bằng 10 sau `tang(4)`?
Hàm có return 5.
Tên cục bộ và tên ngoài có phạm vi khác nhau.
Không có quy tắc đảo phép cộng.
so ngoài được gán trước def.
Lời giải
Trong `tang`, `so` là tham số cục bộ nhận 4 rồi thành 5. Biến ngoài `so=10` không được gán lại.
Đang học