TL; DR
input
hàm trong Python 2.7, đánh giá bất cứ thứ gì bạn nhập, dưới dạng biểu thức Python. Nếu bạn chỉ đơn giản muốn đọc các chuỗi, thì hãy sử dụng raw_input
hàm trong Python 2.7, nó sẽ không đánh giá các chuỗi đọc.
Nếu bạn đang sử dụng Python 3.x, raw_input
đã được đổi tên thành input
. Trích dẫn ghi chú phát hành Python 3.0 ,
raw_input()
đã được đổi tên thành input()
. Đó là, input()
hàm mới đọc một dòng từ sys.stdin
và trả về nó với dòng mới bị tước. Nó tăng EOFError
nếu đầu vào bị chấm dứt sớm. Để có được hành vi cũ của input()
, sử dụngeval(input())
Trong Python 2.7 , có hai hàm có thể được sử dụng để chấp nhận đầu vào của người dùng. Một là input
và một là raw_input
. Bạn có thể nghĩ về mối quan hệ giữa chúng như sau
input = eval(raw_input)
Hãy xem xét đoạn mã sau để hiểu rõ hơn về điều này
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
input
chấp nhận một chuỗi từ người dùng và đánh giá chuỗi trong bối cảnh Python hiện tại. Khi tôi nhập dude
làm đầu vào, nó thấy rằng dude
nó bị ràng buộc với giá trị thefourtheye
và do đó, kết quả đánh giá trở thành thefourtheye
và được gán cho input_variable
.
Nếu tôi nhập một cái gì đó không có trong bối cảnh python hiện tại, nó sẽ thất bại NameError
.
>>> input("Enter your name: ")
Enter your name: dummy
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'dummy' is not defined
Cân nhắc bảo mật với Python 2.7 input
:
Vì bất kỳ loại người dùng nào được đánh giá, nó cũng áp đặt các vấn đề bảo mật. Ví dụ: nếu bạn đã tải os
mô-đun trong chương trình của mình import os
, và sau đó người dùng nhập vào
os.remove("/etc/hosts")
điều này sẽ được đánh giá là một biểu thức gọi hàm bởi python và nó sẽ được thực thi. Nếu bạn đang thực thi Python với các đặc quyền nâng cao, /etc/hosts
tệp sẽ bị xóa. Hãy xem, nó nguy hiểm như thế nào?
Để chứng minh điều này, chúng ta hãy thử thực hiện input
lại chức năng.
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
Bây giờ, khi input("Enter your name: ")
được thực thi, nó chờ đầu vào của người dùng và đầu vào của người dùng là một lời gọi hàm Python hợp lệ và do đó cũng được gọi. Đó là lý do tại sao chúng ta đang thấy Enter your name again:
nhắc nhở một lần nữa.
Vì vậy, bạn tốt hơn với raw_input
chức năng, như thế này
input_variable = raw_input("Enter your name: ")
Nếu bạn cần chuyển đổi kết quả sang một số loại khác, thì bạn có thể sử dụng các hàm thích hợp để chuyển đổi chuỗi được trả về raw_input
. Ví dụ, để đọc các đầu vào dưới dạng số nguyên, hãy sử dụng int
hàm, như thể hiện trong câu trả lời này .
Trong python 3.x , chỉ có một chức năng để nhận đầu vào của người dùng và được gọi input
, tương đương với Python 2.7 raw_input
.
input
hành xử theo cách này, nhưng chỉ trong 2.7. Nó nói gì khi bạn chạypython --version
từ một dấu nhắc lệnh? Ngoài ra, nếu bạn viếtimport sys; print(sys.version)
ở đầu kịch bản thì sao?