2017-08-25 280 views
3

早些時候聽說eval(input(a))將自動轉換爲字符串爲int,但如果輸入過程中我的代碼Python是什麼EVAL之間的區別和int

age = eval(input("enter age")) 

我在01型這是一個錯誤,但是當我代碼

age = int(input("enter age")) 

01作爲輸入完美工作。爲什麼?

+2

@cᴏʟᴅsᴘᴇᴇᴅ這是一個合適的愚蠢目標?該鏈接並未解釋前導零問題。 – vaultah

+1

信任vaultah他知道關於python重複!這個問題很好。 –

+0

好的,重新開放。 –

回答

4

eval評估python表達式。在python 3中,不允許以0開頭的數字(0000除外,請參閱Why does 000 evaluate to 0 in Python 3?)。在Python 2中,這些被解釋爲八進制(基數8)數字。不是更好...(巨蟒-3基地8現在使用專門Oo前綴)

int執行字符串整數轉換,所以不能評價一個複雜的表達式(即你不需要),但不進行這個領先的零語法。

另一個優點是,你可以檢查,如果輸入的表達是通過使用簡單的合格try/except塊的整數

while True: 
    try: 
     age = int(input("enter age")) 
     break 
    except ValueError: 
     print("Retry!") 

(與eval你就必須防止所有的例外)

建議:使用int,因爲它更安全,沒有安全問題(eval可以評估任何表達式,包括系統調用和文件刪除),並且完美地滿足您的需求。

注意:上面的代碼仍然不安全與python 2:input行爲如eval。你可以在你的模塊開始用簡單的代碼保護代碼反對這樣的:

try: 
    input = raw_input 
except NameError: 
    pass 

所以Python 2 input是不是再也無法訪問,並呼籲raw_input代替。 Python 3會忽略該代碼。

+5

它不僅更安全 - 它也會失敗,所以如果不能生成int,那麼你可以重新嘗試或者其他任何東西,而不是產生*不是*的東西*一個... –

+0

好點。編輯 –

+0

我可以理解爲'eval'用於執行非常複雜的表達式,而'int'只將字符串轉換爲整數?什麼是八進制和零語法? –

1

eval()用於驗證表達式。數字被認爲是一個表達式,除了八進制數字(以0開頭的數字)。 Int()將字符串轉換爲整數。有很多原因可以避免使用eval。請記住:

的Python 2.x的
X =的raw_input( '在這裏輸入號碼: ')

Python 3.x都有
X =輸入(' 在這裏輸入號碼:')

的Python 2.x的
安全風險:
X =輸入( '在這裏輸入號碼:')

Python 3.x都有
安全風險:
X =的eval(輸入(「在這裏輸入數字:」))

另外,請記住,eval()具有運行代碼的可能性,這可能會導致巨大的安全隱患。我建議不要使用它,除非你清楚地知道你在做什麼或者它可能危及你的應用程序。

+0

什麼樣的安全風險?我是編程新手 –

+0

你可以查看很多不同的例子和解釋[這裏](https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) –

+0

你可以例如'import subprocess; eval(「subprocess.run('我喜歡的任何程序')」)'這是非常危險的,用戶不應該被允許去做。因此,您應該只將100%可信賴的輸入傳遞給'eval'。 – user1747134

相關問題