在Python 3中,`raw_input()`和`input()`有什么区别?

398

raw_input()input() 在 Python 3 中有什么区别?


(注:保留了原来的html标签)

3
如何编写一个既能够接受Python 2又能够接受Python 3的输入的程序? - Solomon Ucko
2
为此,您尝试将 "input" 设置为 "raw_input" 并忽略名称错误。 - Solomon Ucko
3
请查找适用于Python 2和3兼容性的“six”库。 - Jack Homan
1
我所做的就是在“try:”块中编写Python 2代码,在“except NameError:”块中编写Python 3代码。 - Esmu Igors
6个回答

452

不同之处在于,在Python 3.x中不存在raw_input(),而是存在input()。实际上,旧的raw_input()已被重命名为input(),而旧的input()已经消失,但可以通过使用eval(input())来轻松模拟。(请记住,eval()很危险,请尽可能使用更安全的方式解析输入。)


107
raw_input和其他函数的区别是raw_input不存在。”……我得说,这是一个相当大的区别! - ivan_pozdeev
10
在Python 2中,我猜他们认为程序员希望实际上执行用户输入作为命令,因为最初(我猜)从用户那里请求输入可能只是为了这个目的。但当他们意识到程序员可能还想要获得“原始”输入时,他们设计了另一个名为“raw_input”的函数。在Python 3中,他们意识到这是多么愚蠢,并简单地删除了原始输入默认的执行方式,只保留了一个简单的函数。 - user4396006
1
Repl.it 运行 Py3.5.1 版本,其中 raw_input() 是一个关键字。 - AAM111
3
需要说明的是,应该尽量避免使用eval(和exec)因为它们可能存在安全风险。具体详情请参见SO老手Ned Batchelder的文章Eval really is dangerous。当然这个建议也适用于旧版的Python 2中的input函数。 - PM 2Ring
1
@PM2Ring,我在答案中添加了一个警告。当然,使用eval()exec()都有合法的用例,但你首先需要理解为什么不应该使用eval(),然后再决定是否使用它。 - Sven Marnach
值得注意的是,这仍在进行调整,文档显示Py34和Py36在基本int处理方面发生了变化:[链接]https://docs.python.org/3/library/functions.html#input - MJM

198

在Python 2中,raw_input()返回一个字符串,而input()则尝试将输入作为Python表达式运行。

由于几乎总是需要获取一个字符串,因此Python 3使用input()来实现。正如Sven所说,如果您需要旧的行为,则可以使用eval(input())


8
你应该补充说明Python 3中没有raw_input()函数。 - Martin Thoma
运行输入作为 Python 表达式的用途是什么? - Akshay Vijay Jain
1
@AkshayVijayJain,可能是为了输入数字而设计的。但它是完全不安全的。 - MarSoft

125

Python 2:

  • raw_input()接受用户输入并以字符串形式返回。

  • input()首先接受raw_input(),然后执行eval()

主要区别在于input()需要一个语法正确的python语句,而raw_input()不需要。

Python 3:

  • raw_input()已更名为input(),现在input()返回完全相同的字符串。
  • 旧版的input()已被删除。

如果您想使用旧版的input(),也就是需要将用户输入作为python语句进行评估,那么您必须手动使用eval(input())


31
在Python 3中,raw_input()已经被取消,Sven也提到了这一点。
在Python 2中,input()函数会对你的输入进行评估。 例如:
name = input("what is your name ?")
what is your name ?harsha

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    name = input("what is your name ?")
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined
在上面的例子中,Python 2.x 试图将“harsha”解释为一个变量而不是一个字符串。为了避免这种情况,我们可以在输入周围使用双引号,例如"harsha":
>>> name = input("what is your name?")
what is your name?"harsha"
>>> print(name)
harsha

raw_input()

raw_input()函数不会对输入的内容进行评估,它只会将您输入的内容读取出来。

例如:

name = raw_input("what is your name ?")
what is your name ?harsha
>>> name
'harsha'

示例:

 name = eval(raw_input("what is your name?"))
what is your name?harsha

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    name = eval(raw_input("what is your name?"))
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined

在上面的示例中,我只是试图使用eval函数评估用户输入。


8
我想为每个人提供的关于Python 2用户的解释增加一些细节。现在你知道raw_input()评估用户输入的任何数据都是字符串。这意味着Python不会再次尝试理解输入的数据。它只会认为输入的数据是字符串,无论它是否实际上是一个字符串、整数或其他类型。
另一方面,input()会尝试理解用户输入的数据。所以像helloworld这样的输入甚至会显示错误消息“helloworld未定义”。
总之,在Python 2中,即使要输入一个字符串,你也需要按照Python中常用的字符串结构“helloworld”来输入。

5

如果您想确保您的代码在Python2和Python3中运行,请在脚本开头添加input()函数:

from sys import version_info
if version_info.major == 3:
    pass
elif version_info.major == 2:
    try:
        input = raw_input
    except NameError:
        pass
else:
    print ("Unknown python version - input function not safe")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接