问题:input()错误-NameError:名称“ …”未定义
尝试运行此简单脚本时出现错误:
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
假设我输入“花花公子”,我得到的错误是:
line 1, in <module>
input_variable = input ("Enter your name: ")
File "<string>", line 1, in <module>
NameError: name 'dude' is not defined
我正在使用python 2.7运行这些脚本。
回答 0
TL; DR
input
Python 2.7中的函数,将您输入的内容评估为Python表达式。如果您只是想读取字符串,请使用raw_input
Python 2.7中的函数,该函数不会评估读取的字符串。
如果您使用的是Python 3.x,raw_input
则已重命名为input
。引用Python 3.0发行说明,
raw_input()
已重命名为input()
。也就是说,新input()
函数从中读取一行,sys.stdin
并删除尾随的换行符来返回它。EOFError
如果输入过早终止,它将触发。要获取的旧行为input()
,请使用eval(input())
在Python 2.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
Python 2.7的安全注意事项input
:
由于评估了任何用户类型,因此也存在安全问题。例如,如果您已经使用加载os
了程序中的模块import 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函数调用,因此也会被调用。这就是为什么我们Enter your name again:
再次看到提示。
因此,您最好使用这样的raw_input
功能
input_variable = raw_input("Enter your name: ")
如果需要将结果转换为其他类型,则可以使用适当的函数将所返回的字符串转换为raw_input
。例如,要将输入读取为整数,请使用此答案中int
所示的函数。
在python 3.x中,只有一个函数可以获取用户输入,该函数称为input
python 2.7的raw_input
。
回答 1
您正在运行Python 2,而不是Python3。要在Python 2中运行,请使用raw_input
。
input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
回答 2
由于您是为Python 3.x编写的,因此您需要以以下内容开始脚本:
#!/usr/bin/env python3
如果您使用:
#!/usr/bin/env python
它将默认为Python2.x。如果没有以#开头的内容,它们将放在脚本的第一行。(又名shebang)。
如果您的脚本仅以以下内容开头:
#! python
然后,您可以将其更改为:
#! python3
尽管只有一些程序(例如启动器)可以识别这种较短的格式,但这并不是最佳选择。
前两个示例被广泛使用,将有助于确保您的代码在安装了Python的任何计算机上都能正常工作。
回答 3
您应该使用,raw_input
因为您使用的是python-2.7。在input()
变量上使用时(例如s = input('Name: ')
:),它将在Python环境上执行命令,而不会保存您在变量(s
)上写的内容,如果未定义写的内容,则会产生错误。
raw_input()
会正确保存您在变量上写的内容(例如:)f = raw_input('Name : ')
,并且不会在Python环境中执行该操作而不会产生任何可能的错误:
input_variable = raw_input('Enter Your Name : ')
print("Your Name Is : " + (input_variable))
回答 4
对于python 3及更高版本
s = raw_input()
如果您要在hackerrank网站上进行在线解决,它将解决pycharm IDE上的问题,然后使用:
s = input()
回答 5
您可以这样做:
x = raw_input("enter your name")
print "your name is %s " % x
要么:
x = str(input("enter your name"))
print "your name is %s" % x
回答 6
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
您必须输入单引号或双引号
Ex:'dude' -> correct
dude -> not correct
回答 7
我还遇到了一个本应与python 2.7和3.7兼容的模块的问题
我发现解决问题的是导入:
from six.moves import input
这固定了两个口译员的可用性
回答 8
我们正在使用以下适用于python 2和python 3的内容
#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
回答 9
对于可能会遇到此问题的其他任何人,事实证明,即使您#!/usr/bin/env python3
在脚本的开头添加了该文件,如果该文件不可执行,也将忽略shebang。
要确定您的文件是否可执行:
- 运行
./filename.py
在命令行 - 如果得到
-bash: ./filename.py: Permission denied
,请运行chmod a+x filename.py
- 再跑
./filename.py
一次
如果您已import sys; print(sys.version)
按照Kevin的建议加入,现在您将看到python3正在解释该脚本
回答 10
以前的贡献不错。
import sys; print(sys.version)
def ingreso(nombre):
print('Hi ', nombre, type(nombre))
def bienvenida(nombre):
print("Hi "+nombre+", bye ")
nombre = raw_input("Enter your name: ")
ingreso(nombre)
bienvenida(nombre)
#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Your name: "))
输入您的姓名:Joe (“嗨”,“乔”,<类型“ str”>) 嗨乔,再见 您的名字:Joe 乔
谢谢!
回答 11
有两种方法可以解决这些问题,
第一个很简单,无需更改代码,该代码
由Python3运行,
如果您仍然想在python2上运行,那么在运行python脚本后,输入输入时请记住- 如果要输入,
string
则只需使用“ input go with double-quote”输入即可,它将在python2.7和 - 如果您想输入字符,请在输入中使用单引号,例如“您的输入在此处”
- 如果您想输入数字而不是问题,只需键入数字
- 如果要输入,
第二种方法是代码更改,
使用以下导入并与任何版本的python一起运行from six.moves import input
- 在任何导入中使用
raw_input()
函数代替input()
代码中的函数 - 使用
str()
like函数清理代码,str(input())
然后将其分配给任何变量
错误提示:
未定义名称“ dude”,即python的“ dude”在此处变为变量,并且没有分配任何python定义的类型的值,
因此只能像婴儿一样哭泣,因此如果我们定义“ dude”变量并分配任何值并传递给它,它将起作用,但这不是我们想要的,因为我们不知道用户将输入什么,此外,我们还希望捕获用户输入。
关于这些方法的事实:
input()
函数:此函数按原样使用您输入的输入的值和类型,而无需修改其类型。raw_input()
函数:此函数将您提供的输入明确转换为字符串类型,注意:
input()方法的漏洞在于,任何人都可以使用变量或方法的名称来访问访问输入值的变量。
回答 12
您可以更改在IDE中使用的python,如果您已经下载了python 3.x,则切换起来应该不太困难。但是您的脚本可以在python 3.x上正常工作,我只需要更改
print ("your name is" + input_variable)
至
print ("your name is", input_variable)
因为使用逗号,它会your name is
在用户输入的内容与输入内容之间加上空格。AND:如果您使用的是2.7,请使用raw_input
代替输入。