TL; DR
input
在Python 2.7的功能,評估無論你的進入,作爲一個Python表達式。如果你只是想讀取字符串,那麼在Python 2.7中使用raw_input
函數,它不會評估讀取的字符串。
如果您使用的是Python 3.x,則raw_input
已被重命名爲input
。引述Python 3.0 release notes,
raw_input()
was renamed to input()
. That is, the new input()
function reads a line from sys.stdin
and returns it with the trailing newline stripped. It raises EOFError
if the input is terminated prematurely. To get the old behavior of input()
, use eval(input())
在Python 2.7,存在可用於接收用戶輸入兩個功能。一個是input
,另一個是raw_input
。你可以把它們之間的關係如下
input = eval(raw_input)
考慮下面的代碼,以更好地理解這種
>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'
input
接受來自用戶的字符串,並評估了當前的Python上下文中的字符串。當我鍵入dude
作爲輸入時,它發現dude
綁定到值thefourtheye
,因此評估結果變爲thefourtheye
並且被分配到input_variable
。
如果我在當前python上下文中輸入了一些不存在的東西,它將失敗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
安全考慮與Python 2.7的input
:
因爲無論用戶類型進行評估,它規定的安全問題也是如此。例如,如果您已經加載os
模塊在你的程序與import os
,然後用戶在
os.remove("/etc/hosts")
這將被評爲由Python中的函數調用表達式,它會被執行。如果您使用提升的權限執行Python,則/etc/hosts
文件將被刪除。看,它有多危險?
爲了演示這一點,我們試着再次執行input
函數。
>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude
現在,當執行input("Enter your name: ")
,它等待用戶輸入和所述用戶輸入是一個有效的Python函數調用,並且使得也調用。這就是爲什麼我們再次看到Enter your name again:
提示。
所以,你是raw_input
功能更好,這樣
input_variable = raw_input("Enter your name: ")
如果您需要將結果轉換爲其他類型,那麼你可以使用相應的功能由raw_input
返回的字符串轉換。例如,要將輸入讀取爲整數,請使用int
函數,如this answer中所示。
在Python 3.x都有,只有一個函數來獲取用戶輸入和那個叫input
,這相當於Python 2.7版的raw_input
。
你確定它是Python 3.3?我希望'輸入'表現這種方式,但只有2.7。當你從命令提示符運行'python --version'時它說了什麼?另外,如果你寫'import sys;打印(sys.version)'在腳本的開頭? – Kevin
你沒有運行的Python 3.您正在運行的Python 2,不知爲什麼(我不熟悉這個「Python的啓動器」應用程序) – geoffspear
將作爲一線'進口sys'和第二行'打印(sys.version_info )'以確定您使用的是哪個版本。 – Hyperboreus