Hỏi về vấn đề khai báo biến trong scripting language
Nhiều scripting language nổi tiếng (Javascript, Python, PHP) không cần (và không có cách nào để) khai báo biến, cứ ghi ra là có. Ví dụ lụm trên mạng:
Python:
counter = 100 # An integer assignment
miles = 1000.0 # A floating point
name = "John" # A string
print counter
print miles
print name
Javascript (như trên):
counter = 100
name = "John"
console.log(counter);
console.log(name);
PHP
$txt = "Hello world!";
$x = 5;
$y = 10.5;
Nhưng, có ai nghĩ đến cái sự nguy hiểm tiềm tàng của điều này không:
# Python
received = False
while not received:
recieved = True # lặp cho tới ngày tận thế
Chỉ có Javascript (hình như cả Perl nữa) là có strict mode giúp tránh khỏi những điều này, cho nên Javascript thành scripting language yêu thích của mình, thật đáng tiếc khi đội Nodejs không thèm phát triển lên cho ngang cơ với Python.
Khi mà thuật toán trở nên phức tạp hơn, việc phát hiện những lỗi logic như thế này rất khó khăn.
Các bạn nghĩ sao về điều này? Với mình, một ngôn ngữ mạnh như Python mà lại bị điều này, một điều rất khó chịu, thế mà vẫn trở thành ngôn ngữ phổ biến, nổi tiếng.
Còn cả vấn đề ở Python mà mình rất ức chế:
Như mình code ở C++ thì 2 biến i kia mình sẽ khai báo là
for (int i=0,...)
, đều sử dụng 2 biến i được, nhưng trong Python thì bị báo lỗi (hôm qua vừa dính lỗi này, debug hết hơi).Nói chung là Python mạnh nhưng mà gặp nhiều quả khai báo biến ntn có mà ốm :’(
Ai giải thích cho em đoạn này được không ạ?
Nó với đoạn sau đây nó khác nhau chỗ nào thế a?
Code đó tương đương với:
e khi lỗn chữ a đó ạ
bấm nhầm tên biến số, và điều kiện của while không bao giờ sai
Dạ thôi bỏ qua ạ. E muốn hỏi đoạn này
Thì bấm nhầm received thành recieved (dòng số 3), not received mãi mãi bằng True
à à à e thấy rồi
Sao em không thấy gì khác lạ nhỉ
Trời! Đoạn code ví dụ cho Python có lặp gì đâu.
KhiOk, không để ý chỗ sai chính tảrecieved = True
thìnot recieved == False
thì vòng lặp dừng mà@sueruan012: code ví dụ thiếu dấu 2 chấm sau
def fun2(id):
.Nói chung là mình chỉ hiểu là bạn đang muốn “strict mode” ở các ngôn ngữ khác?
Chỗ đó thật ra là recieved = True (Viết sai chính tả rec ie ved)
Đúng rồi, đáng lẽ ra mọi ngôn ngữ đều nên có “strict mode”.
Anh cũng giống em mới nhìn vào tưởng là vậy. Nhưng nhìn kĩ lại khi chạy thì nó không vậy đâu
Mình chạy trên Pycharm bị dính lỗi mà :’(
Python 3.6.1 Vẫn bình thuồng mà xD
Mình cũng thấy vụ này không ổn, dùng pycharm thì cũng tạm tránh được lỗi kiểu này, chỉ cần đặt tên biến có ý nghĩa 1 tí với chăm chỉ dùng auto-complete là được