提问者:小点点

input()error-NameError:未定义名称“…”


当我试图运行这个简单的脚本时,我遇到了一个错误:

input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)

假设我输入“dude”,我得到的错误是:

line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined

我正在用Python2.7运行这些脚本。


共3个答案

匿名用户

DR

Python2.7中的input函数,以Python表达式的形式计算输入的内容。 如果您只是想读取字符串,那么使用Python2.7中的RAW_INPUT函数,该函数不会计算读取的字符串。

如果您使用的是Python3.x,则RAW_INPUT已重命名为input。 引用Python3.0发行说明,

raw_input()已重命名为input()。 也就是说,新的input()函数从sys.stdin中读取一行,并返回它,去掉后面的换行符。 如果输入过早终止,则会引发eOFERROR。 要获取input()的旧行为,请使用eval(input())

在Python2.7中,有两个函数可用于接受用户输入。 一个是input,另一个是raw_input。 你可以把它们之间的关系想象如下

input = eval(raw_input)

为了更好地理解这一点,请考虑下面的一段代码

>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'

input接受来自用户的字符串,并在当前Python上下文中计算该字符串。 当我键入dude作为输入时,它发现dude绑定到值TheFourtheYe,因此计算结果变为TheFourtheYe,并分配给input_variable

如果我输入了当前python上下文中没有的其他内容,那么NameError将会失败。

>>> input("Enter your name: ")
Enter your name: dummy
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'dummy' is not defined

Python2.7的输入的安全注意事项:

因为无论用户键入什么,都会进行评估,这也会带来安全问题。 例如,如果您已经用Import OS在程序中加载了OS模块,然后用户键入

os.remove("/etc/hosts")

这将被python评估为函数调用表达式,并执行它。 如果您正在以提升的权限执行Python,/etc/hosts文件将被删除。 你看,这有多危险?

为了演示这一点,让我们再次尝试执行input函数。

>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude

现在,当input(“enter your name:”)被执行时,它将等待用户输入,而用户输入是一个有效的Python函数调用,因此也会被调用。 这就是为什么我们再次看到再次输入您的名字:提示。

因此,使用RAW_INPUT函数更好,如下所示

input_variable = raw_input("Enter your name: ")

如果需要将结果转换为某种其他类型,那么可以使用适当的函数来转换RAW_INPUT返回的字符串。 例如,要将输入读取为整数,请使用int函数,如以下答案所示。

在Python3.x中,只有一个函数用于获取用户输入,它叫做input,相当于Python2.7的raw_input

匿名用户

您运行的是Python2,而不是Python3。 要在Python2中工作,请使用RAW_INPUT

input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)

匿名用户

由于您是为Python3.x编写的,因此您需要以以下内容开始您的脚本:

#!/usr/bin/env python3

如果使用:

#!/usr/bin/env python

它将默认为Python2.x。 如果没有以#开头的内容,这些将放在脚本的第一行! (又称舍邦)。

如果您的脚本只是以:

#! python

则可以将其更改为:

#! python3

虽然这种较短的格式化只被少数程序所识别,比如launcher,所以它并不是最佳选择。

前两个示例的应用更为广泛,将有助于确保您的代码能够在任何安装了Python的机器上工作。