早些時候聽說eval(input(a))
將自動轉換爲字符串爲int,但如果輸入過程中我的代碼Python是什麼EVAL之間的區別和int
age = eval(input("enter age"))
我在01型這是一個錯誤,但是當我代碼
age = int(input("enter age"))
01作爲輸入完美工作。爲什麼?
早些時候聽說eval(input(a))
將自動轉換爲字符串爲int,但如果輸入過程中我的代碼Python是什麼EVAL之間的區別和int
age = eval(input("enter age"))
我在01型這是一個錯誤,但是當我代碼
age = int(input("enter age"))
01作爲輸入完美工作。爲什麼?
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會忽略該代碼。
它不僅更安全 - 它也會失敗,所以如果不能生成int,那麼你可以重新嘗試或者其他任何東西,而不是產生*不是*的東西*一個... –
好點。編輯 –
我可以理解爲'eval'用於執行非常複雜的表達式,而'int'只將字符串轉換爲整數?什麼是八進制和零語法? –
eval()
用於驗證表達式。數字被認爲是一個表達式,除了八進制數字(以0開頭的數字)。 Int()
將字符串轉換爲整數。有很多原因可以避免使用eval。請記住:
的Python 2.x的
X =的raw_input( '在這裏輸入號碼: ')
Python 3.x都有
X =輸入(' 在這裏輸入號碼:')
的Python 2.x的
安全風險:
X =輸入( '在這裏輸入號碼:')
Python 3.x都有
安全風險:
X =的eval(輸入(「在這裏輸入數字:」))
另外,請記住,eval()
具有運行代碼的可能性,這可能會導致巨大的安全隱患。我建議不要使用它,除非你清楚地知道你在做什麼或者它可能危及你的應用程序。
什麼樣的安全風險?我是編程新手 –
你可以查看很多不同的例子和解釋[這裏](https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) –
你可以例如'import subprocess; eval(「subprocess.run('我喜歡的任何程序')」)'這是非常危險的,用戶不應該被允許去做。因此,您應該只將100%可信賴的輸入傳遞給'eval'。 – user1747134
@cᴏʟᴅsᴘᴇᴇᴅ這是一個合適的愚蠢目標?該鏈接並未解釋前導零問題。 – vaultah
信任vaultah他知道關於python重複!這個問題很好。 –
好的,重新開放。 –