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()` 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章