01/10/2018, 10:00

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.

HK boy viết 12:15 ngày 01/10/2018

Còn cả vấn đề ở Python mà mình rất ức chế:

def fun():
    for i in range(10):
        fun2(i)

def fun2(id):
    for i in range(10):
        print(i+id, "fun")

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 :’(

Henry viết 12:11 ngày 01/10/2018

received = False
while not received:
recieved = True

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?

n = 0
while not a:
    n = 1
明玉 viết 12:08 ngày 01/10/2018

Code đó tương đương với:

a = False
while not a:
   b = True # thôi xong
Henry viết 12:08 ngày 01/10/2018

e khi lỗn chữ a đó ạ

明玉 viết 12:12 ngày 01/10/2018

bấm nhầm tên biến số, và điều kiện của while không bao giờ sai

Henry viết 12:00 ngày 01/10/2018

received = False
while not received:
recieved = True

Dạ thôi bỏ qua ạ. E muốn hỏi đoạn này

明玉 viết 12:16 ngày 01/10/2018

Thì bấm nhầm received thành recieved (dòng số 3), not received mãi mãi bằng True

Henry viết 12:00 ngày 01/10/2018

à à à e thấy rồi

Henry viết 12:12 ngày 01/10/2018

Sao em không thấy gì khác lạ nhỉ

Khoa NTA viết 12:12 ngày 01/10/2018

Trời! Đoạn code ví dụ cho Python có lặp gì đâu. Khi recieved = True thì not recieved == False thì vòng lặp dừng mà Ok, không để ý chỗ sai chính tả

@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?

明玉 viết 12:08 ngày 01/10/2018

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”.

Henry viết 12:04 ngày 01/10/2018

Trời! Đoạn code ví dụ cho Python có lặp gì đâu. Khi received = True thì not received == False thì vòng lặp dừng mà

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

HK boy viết 12:06 ngày 01/10/2018

Mình chạy trên Pycharm bị dính lỗi mà :’(

Henry viết 12:15 ngày 01/10/2018

Python 3.6.1 Vẫn bình thuồng mà xD

Thành Phạm viết 12:02 ngày 01/10/2018

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

Bài liên quan
0