Why does Python's eval(input(“Enter input: ”)) change input's datatype?
In Python 3, I write a simple command to accept an integer input from the user thus:
x = int(input("Enter a number: "))
If I skip the int()
part and simply use x = input("Enter a number: ")
, my input's datatype is a string, not an integer. I understand that.
However, if I use the following command:
x = eval(input("Enter a number: "))
the input's datatype is 'int'.
Why does this happen?
python eval type-conversion
add a comment |
In Python 3, I write a simple command to accept an integer input from the user thus:
x = int(input("Enter a number: "))
If I skip the int()
part and simply use x = input("Enter a number: ")
, my input's datatype is a string, not an integer. I understand that.
However, if I use the following command:
x = eval(input("Enter a number: "))
the input's datatype is 'int'.
Why does this happen?
python eval type-conversion
maybe it is a dynamic type check when you use eval()?
– cssGEEK
Jun 19 '16 at 19:12
1
eval
treats the input like it was written in code, doingx = 3
in code makes an integer, sox = eval("3")
will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed inopen(__file__,'w').close()
it would delete the current executing file.
– Tadhg McDonald-Jensen
Jun 19 '16 at 19:18
add a comment |
In Python 3, I write a simple command to accept an integer input from the user thus:
x = int(input("Enter a number: "))
If I skip the int()
part and simply use x = input("Enter a number: ")
, my input's datatype is a string, not an integer. I understand that.
However, if I use the following command:
x = eval(input("Enter a number: "))
the input's datatype is 'int'.
Why does this happen?
python eval type-conversion
In Python 3, I write a simple command to accept an integer input from the user thus:
x = int(input("Enter a number: "))
If I skip the int()
part and simply use x = input("Enter a number: ")
, my input's datatype is a string, not an integer. I understand that.
However, if I use the following command:
x = eval(input("Enter a number: "))
the input's datatype is 'int'.
Why does this happen?
python eval type-conversion
python eval type-conversion
edited Jun 19 '16 at 19:26
lebowski
asked Jun 19 '16 at 19:07
lebowskilebowski
388320
388320
maybe it is a dynamic type check when you use eval()?
– cssGEEK
Jun 19 '16 at 19:12
1
eval
treats the input like it was written in code, doingx = 3
in code makes an integer, sox = eval("3")
will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed inopen(__file__,'w').close()
it would delete the current executing file.
– Tadhg McDonald-Jensen
Jun 19 '16 at 19:18
add a comment |
maybe it is a dynamic type check when you use eval()?
– cssGEEK
Jun 19 '16 at 19:12
1
eval
treats the input like it was written in code, doingx = 3
in code makes an integer, sox = eval("3")
will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed inopen(__file__,'w').close()
it would delete the current executing file.
– Tadhg McDonald-Jensen
Jun 19 '16 at 19:18
maybe it is a dynamic type check when you use eval()?
– cssGEEK
Jun 19 '16 at 19:12
maybe it is a dynamic type check when you use eval()?
– cssGEEK
Jun 19 '16 at 19:12
1
1
eval
treats the input like it was written in code, doing x = 3
in code makes an integer, so x = eval("3")
will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed in open(__file__,'w').close()
it would delete the current executing file.– Tadhg McDonald-Jensen
Jun 19 '16 at 19:18
eval
treats the input like it was written in code, doing x = 3
in code makes an integer, so x = eval("3")
will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed in open(__file__,'w').close()
it would delete the current executing file.– Tadhg McDonald-Jensen
Jun 19 '16 at 19:18
add a comment |
2 Answers
2
active
oldest
votes
Why does this happen?
x = eval(input("Enter a number: "))
is not the same thing as x = eval('input("Enter a number: ")')
The former first calls input(...)
, gets a string, e.g. '5'
then evaluates it, that's why you get an int
, in this manner:
>>> eval('5') # the str '5' is e.g. the value it gets after calling input(...)
5 # You get an int
While the latter (more aligned with what you were expecting), evaluates the expression 'input("Enter a number: ")'
>>> x = eval('input("Enter a number: ")')
Enter a number: 5
>>> x
'5' # Here you get a str
add a comment |
Because a number is a valid expression in Python, and it evaluates to itself (and its type is int). For example, if you input a rubbish string with a non-existing name (say, 'abcdefgh'), a NameError exception will be raised (the exception is raised while evaluating).
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f37910827%2fwhy-does-pythons-evalinputenter-input-change-inputs-datatype%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Why does this happen?
x = eval(input("Enter a number: "))
is not the same thing as x = eval('input("Enter a number: ")')
The former first calls input(...)
, gets a string, e.g. '5'
then evaluates it, that's why you get an int
, in this manner:
>>> eval('5') # the str '5' is e.g. the value it gets after calling input(...)
5 # You get an int
While the latter (more aligned with what you were expecting), evaluates the expression 'input("Enter a number: ")'
>>> x = eval('input("Enter a number: ")')
Enter a number: 5
>>> x
'5' # Here you get a str
add a comment |
Why does this happen?
x = eval(input("Enter a number: "))
is not the same thing as x = eval('input("Enter a number: ")')
The former first calls input(...)
, gets a string, e.g. '5'
then evaluates it, that's why you get an int
, in this manner:
>>> eval('5') # the str '5' is e.g. the value it gets after calling input(...)
5 # You get an int
While the latter (more aligned with what you were expecting), evaluates the expression 'input("Enter a number: ")'
>>> x = eval('input("Enter a number: ")')
Enter a number: 5
>>> x
'5' # Here you get a str
add a comment |
Why does this happen?
x = eval(input("Enter a number: "))
is not the same thing as x = eval('input("Enter a number: ")')
The former first calls input(...)
, gets a string, e.g. '5'
then evaluates it, that's why you get an int
, in this manner:
>>> eval('5') # the str '5' is e.g. the value it gets after calling input(...)
5 # You get an int
While the latter (more aligned with what you were expecting), evaluates the expression 'input("Enter a number: ")'
>>> x = eval('input("Enter a number: ")')
Enter a number: 5
>>> x
'5' # Here you get a str
Why does this happen?
x = eval(input("Enter a number: "))
is not the same thing as x = eval('input("Enter a number: ")')
The former first calls input(...)
, gets a string, e.g. '5'
then evaluates it, that's why you get an int
, in this manner:
>>> eval('5') # the str '5' is e.g. the value it gets after calling input(...)
5 # You get an int
While the latter (more aligned with what you were expecting), evaluates the expression 'input("Enter a number: ")'
>>> x = eval('input("Enter a number: ")')
Enter a number: 5
>>> x
'5' # Here you get a str
edited Jun 19 '16 at 19:18
answered Jun 19 '16 at 19:12
bakkalbakkal
41.5k98286
41.5k98286
add a comment |
add a comment |
Because a number is a valid expression in Python, and it evaluates to itself (and its type is int). For example, if you input a rubbish string with a non-existing name (say, 'abcdefgh'), a NameError exception will be raised (the exception is raised while evaluating).
add a comment |
Because a number is a valid expression in Python, and it evaluates to itself (and its type is int). For example, if you input a rubbish string with a non-existing name (say, 'abcdefgh'), a NameError exception will be raised (the exception is raised while evaluating).
add a comment |
Because a number is a valid expression in Python, and it evaluates to itself (and its type is int). For example, if you input a rubbish string with a non-existing name (say, 'abcdefgh'), a NameError exception will be raised (the exception is raised while evaluating).
Because a number is a valid expression in Python, and it evaluates to itself (and its type is int). For example, if you input a rubbish string with a non-existing name (say, 'abcdefgh'), a NameError exception will be raised (the exception is raised while evaluating).
answered Jun 19 '16 at 19:12
Pavel GurkovPavel Gurkov
564413
564413
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f37910827%2fwhy-does-pythons-evalinputenter-input-change-inputs-datatype%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
maybe it is a dynamic type check when you use eval()?
– cssGEEK
Jun 19 '16 at 19:12
1
eval
treats the input like it was written in code, doingx = 3
in code makes an integer, sox = eval("3")
will also make x an integer, however letting the user enter arbitrary code as their input can be a huge problem, if they typed inopen(__file__,'w').close()
it would delete the current executing file.– Tadhg McDonald-Jensen
Jun 19 '16 at 19:18