提问人:chillpenguin 提问时间:1/15/2014 最后编辑:wjandreachillpenguin 更新时间:3/28/2023 访问量:917907
input() 错误 - NameError: name '...'未定义
input() error - NameError: name '...' is not defined
问:
当我尝试运行这个简单的脚本时,我遇到错误:
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
我正在运行 Mac OS X 10.9.1,并且我正在使用 Python 3.3 安装附带的 Python Launcher 应用程序来运行该脚本。
答:
您运行的是 Python 2,而不是 Python 3。要在 Python 2 中工作,请使用 .raw_input
input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
TL的;博士
input
Python 2.7 中的函数,将您输入的任何内容作为 Python 表达式进行评估。如果您只是想读取字符串,请使用 Python 2.7 中的函数,它不会计算读取的字符串。raw_input
如果您使用的是 Python 3.x,则已重命名为 。引用 Python 3.0 发行说明,raw_input
input
raw_input()
已重命名为 。也就是说,新函数从中读取一行,并在剥离尾随换行符的情况下返回该行。如果输入过早终止,则会引发输入。要获取 的旧行为,请使用input()
input()
sys.stdin
EOFError
input()
eval(input())
在 Python 2.7 中,有两个函数可用于接受用户输入。一个是输入
,另一个是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 输入
的安全注意事项:
由于评估的是任何用户类型,因此它也会带来安全问题。例如,如果您已经使用 在程序中加载了模块,然后用户键入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
现在,当执行时,它会等待用户输入,并且用户输入是有效的 Python 函数调用,因此也会被调用。这就是为什么我们再次看到提示的原因。input("Enter your name: ")
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
由于您正在为 Python 3.x 编写脚本,因此您需要从以下位置开始编写脚本:
#!/usr/bin/env python3
如果您使用:
#!/usr/bin/env python
它将默认为 Python 2.x。这些放在脚本的第一行,如果没有以 #! (又名 shebang)开头的内容。
如果您的脚本仅以以下方式开头:
#! python
然后,您可以将其更改为:
#! python3
虽然这种较短的格式只有少数程序可以识别,例如启动器,但它不是最佳选择。
前两个示例使用得更广泛,将有助于确保您的代码可以在任何安装了 Python 的机器上运行。
对于可能遇到此问题的其他任何人,事实证明,即使您在脚本的开头包含,如果文件不可执行,shebang 也会被忽略。#!/usr/bin/env python3
要确定您的文件是否可执行,请执行以下操作:
- 从命令行运行
./filename.py
- 如果得到 ,请运行
-bash: ./filename.py: Permission denied
chmod a+x filename.py
- 再次运行
./filename.py
如果你按照 Kevin 的建议包含了脚本,你现在会看到脚本正在被 python3 解释import sys; print(sys.version)
您可以更改在 IDE 中使用的 python,如果您已经下载了 python 3.x,切换应该不会太难。但是您的脚本在 python 3.x 上运行良好,我只会更改
print ("your name is" + input_variable)
自
print ("your name is", input_variable)
因为使用逗号时,它会在两者之间以及用户输入的任何内容之间留出空格。并且:如果您使用的是 2.7,请使用而不是输入。your name is
raw_input
您可以执行以下任一操作:
x = raw_input("enter your name")
print "your name is %s " % x
艺术
x = str(input("enter your name"))
print "your name is %s" % x
评论
对于 python 3 及更高版本
s = raw_input()
它将解决pycharm IDE上的问题 如果您正在在线网站上解决 hackerrank 问题,请使用:
s = input()
评论
raw_input
未在 Python 3 中定义。这是“Python 2”的错别字吗?
你应该使用,因为你使用的是 python-2.7。当您在变量上使用时(例如:),它将在 Python 环境中执行命令,而不保存您在变量 () 上写入的内容,如果您编写的内容未定义,则会产生错误。raw_input
input()
s = input('Name: ')
s
raw_input()
将正确保存您在变量上写入的内容(例如: ),并且它不会在 Python 环境中执行它而不会产生任何可能的错误:f = raw_input('Name : ')
input_variable = raw_input('Enter Your Name : ')
print("Your Name Is : " + (input_variable))
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
您必须在单引号或双引号中输入输入
Ex:'dude' -> correct
dude -> not correct
我们正在使用以下适用于 python 2 和 python 3 的方法
#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
对以前的贡献很好。
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: "))
Enter your name: Joe ('Hi ', 'Joe', <type 'str'>) Hi Joe, bye Your name: Joe Joe
谢谢!
我还遇到了这个问题,该模块应该与python 2.7和3.7兼容
我发现解决该问题的方法是导入:
from six.moves import input
这修复了两个解释器的可用性
您可以在此处阅读有关 Six 图书馆的更多信息
有两种方法可以解决这些问题:
第一个很简单,无需更改代码,即
通过 Python3 运行您的脚本,如果您仍想在 python2 上运行,
那么 运行 Python 脚本后,当您输入输入时,请记住- 如果你想输入,那么只需开始输入“输入带双引号”,它将在 python2.7 和
string
- 如果您想输入字符,请使用带有单引号的输入,例如“您的输入在这里”
- 如果您想输入数字不是问题,您只需输入数字即可
- 如果你想输入,那么只需开始输入“输入带双引号”,它将在 python2.7 和
第二种方法是更改代码,
使用以下导入并使用任何版本的 Python 运行from six.moves import input
- 在代码中使用函数而不是函数进行任何导入
raw_input()
input()
- 使用函数 like 清理代码,然后分配给任何变量
str()
str(input())
正如错误所暗示的那样:
名称“dude”未定义
即对于 python 来说,“伙计”在这里变成了变量,它没有分配任何 python 定义类型的值,所以只有它像婴儿一样哭泣,所以如果我们定义一个“伙计”变量并分配
任何值并传递给它,它会起作用,但这不是我们想要的,因为我们不知道哪个用户会输入,而且我们想要捕获用户输入。
关于这些方法的事实: 函数:
此函数按原样接受您输入的输入的值和类型,而不修改其类型。
function:此函数显式将您给出的输入转换为字符串类型,input()
raw_input()
注意:
input() 方法的漏洞在于 任何人都可以访问访问输入值的变量 只需使用变量或方法的名称即可。
如果您只是想读取字符串,请尝试使用而不是。raw_input
input
print("Enter your name: ")
x = raw_input()
print("Hello, "+x)
下面是一个与 Python 2.7 和 Python 3+ 兼容的输入函数:
(@Hardian略微修改了答案)以避免错误UnboundLocalError: local variable 'input' referenced before assignment
def input_compatible(prompt=None):
try:
input_func = raw_input
except NameError:
input_func = input
return input_func(prompt)
此外,这里还有另一种没有块的替代方案:try
def input_compatible(prompt=None):
input_func = raw_input if "raw_input" in __builtins__.__dict__ else input
return input_func(prompt)
评论
six
six.input
NameError
input_compatible
try
raw_input
six
try
评论
input
python --version
import sys; print(sys.version)
import sys
print(sys.version_info)