Python 3 中的 `raw_input()` 和 `input()` 有啥区别?

Posted

技术标签:

【中文标题】Python 3 中的 `raw_input()` 和 `input()` 有啥区别?【英文标题】:What's the difference between `raw_input()` and `input()` in Python 3?Python 3 中的 `raw_input()` 和 `input()` 有什么区别? 【发布时间】:2011-06-22 08:52:29 【问题描述】:

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

【问题讨论】:

如何制作一个同时接受 Python 2 和 Python 3 输入的程序? 为此,您尝试将input 设置为raw_input 并忽略名称错误。 查找'six'库以获得python 2和3的兼容性。 我所做的只是在“try:”块中编写 Python 2 代码,在“除了 NameError:”块中编写 Python 3 代码。 【参考方案1】:

区别在于 raw_input() 在 Python 3.x 中不存在,而 input() 存在。实际上,旧的raw_input() 已重命名为input(),旧的input() 已不复存在,但可以使用eval(input()) 轻松模拟。 (请记住,eval() 是邪恶的。如果可能,请尝试使用更安全的方法来解析您的输入。)

【讨论】:

"raw_input...有什么区别?" - “不同之处在于没有raw_input。” ...我会说,差别很大! 在 Python 2 中,我猜他们假设程序员想要真正“执行”作为用户输入的命令,因为最初(我猜)请求用户输入可能只是为了这个。但是当他们意识到程序员可能也想要获得“原始”输入时,他们设计了另一个名为“raw_input”的函数。在 Python 3 中,他们注意到这是多么愚蠢,并简单地删除了原始输入默认值的执行,只产生了一个简单的函数。 Repl.it,运行 Py3.5.1 有 raw_input() 作为关键字。 需要说明的是,eval(和exec)通常应该避免,因为它们可能存在安全风险。有关详细信息,请参阅 SO 老将 Ned Batchelder 的Eval really is dangerous。当然,这个建议也适用于旧的 Python 2 input @PM2Ring 我在答案中添加了警告。当然eval()exec() 都有有效的用例,但是在决定使用它之前,您首先需要了解为什么不应该使用eval()【参考方案2】:

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

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

【讨论】:

你应该补充一点,Python 3 没有raw_input() 运行输入作为python表达式有什么用? @AkshayVijayJain,可能是为了输入数字。但这完全不安全。【参考方案3】:

Python 2:

raw_input() 获取用户键入的内容并将其作为字符串传回。

input() 首先获取raw_input(),然后对其执行eval()

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

Python 3:

raw_input() 已重命名为 input(),所以现在 input() 返回确切的字符串。 旧的input() 已被删除。

如果您想使用旧的input(),这意味着您需要将用户输入评估为python 语句,您必须使用eval(input()) 手动完成。

【讨论】:

【参考方案4】:

在 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 函数评估用户输入。

【讨论】:

【参考方案5】:

我想在大家为python 2 用户提供的解释中补充一点细节。 raw_input(),到目前为止,您知道它会评估用户作为字符串输入的任何数据。这意味着 python 甚至不会尝试再次理解输入的数据。它所考虑的只是输入的数据将是字符串,无论它是实际的字符串还是 int 或任何东西。

另一方面,input() 试图理解用户输入的数据。所以像helloworld 这样的输入甚至会将错误显示为'helloworld is undefined'。

总之,对于python 2,要输入字符串也需要像'helloworld'这样输入,这是python中使用字符串的常用结构。

【讨论】:

【参考方案6】:

如果您想确保您的代码使用 python2 和 python3 运行,请在脚本中使用函数输入 () 并将其添加到脚本的开头:

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")

【讨论】:

以上是关于Python 3 中的 `raw_input()` 和 `input()` 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

2与3之间的区别丨python

python-day7--%s与%d的使用,python2中的input及raw_input

私 python input和raw_input的区别

input 和raw_input

python input() 与raw_input()

Python:raw_input 和 input用法