2016-06-19 6 views
5

अजगर 3 में, मैं एक साधारण आदेश लिखना इस प्रकार उपयोगकर्ता से एक पूर्णांक इनपुट स्वीकार करने के लिए:पायथन का eval क्यों (इनपुट ("इनपुट दर्ज करें:")) इनपुट के डेटाटाइप बदलें?

x = int(input("Enter a number: ")) 

अगर मैं int() हिस्सा छोड़ें और सिर्फ x = input("Enter a number: ") उपयोग करते हैं, मेरी इनपुट के डेटाप्रकार एक स्ट्रिंग, नहीं एक पूर्णांक है। मैं समझता हूँ कि।

हालांकि, अगर मैं निम्न आदेश का उपयोग:

x = eval(input("Enter a number: ")) 

इनपुट के डेटाप्रकार 'int' है।

ऐसा क्यों होता है?

+0

जब आप eval() का उपयोग करते हैं तो यह गतिशील प्रकार की जांच हो सकती है? – cssGEEK

+0

'eval' इनपुट में व्यवहार करता है जैसे कोड में लिखा गया था, कोड में 'x = 3' कर एक पूर्णांक बनाता है, इसलिए' x = eval (" 3 ") 'x को एक पूर्णांक भी बना देगा, हालांकि उपयोगकर्ता को मनमाने ढंग से प्रवेश करने दें कोड उनके इनपुट के रूप में एक बड़ी समस्या हो सकती है, अगर वे 'ओपन (__ फ़ाइल __,' डब्ल्यू ') में टाइप की गई हैं। बंद करें()' यह वर्तमान निष्पादन फ़ाइल को हटा देगा। –

उत्तर

5

ऐसा क्यों होता है?

x = eval(input("Enter a number: "))x = eval('input("Enter a number: ")')

पूर्व प्रथम कॉल input(...)

के रूप में एक ही बात नहीं है, एक तार हो जाता है, जैसे कि '5' तो यह मूल्यांकन करता है, यही कारण है कि आप एक int मिलता है, इस तरह से:

>>> eval('5') # the str '5' is e.g. the value it gets after calling input(...) 
5 # You get an int 

यद्यपि द्वितीय (अधिक आप क्या उम्मीद कर रहे थे के साथ गठबंधन), एक नंबर क्योंकि अभिव्यक्ति 'input("Enter a number: ")'

>>> x = eval('input("Enter a number: ")') 
Enter a number: 5 
>>> x 
'5' # Here you get a str 
0

का मूल्यांकन करता है पायथन में एक वैध अभिव्यक्ति है, और यह स्वयं मूल्यांकन करता है (और इसका प्रकार int है)। उदाहरण के लिए, यदि आप एक गैर-मौजूदा नाम (कहें, 'abcdefgh') के साथ एक कचरा स्ट्रिंग इनपुट करते हैं, तो एक नाम त्रुटि अपवाद उठाया जाएगा (मूल्यांकन के दौरान अपवाद उठाया जाता है)।

संबंधित मुद्दे