为什么在使用输入函数(在 Python 2.x 中)时会出现“NameError:名称‘...’未定义”(或 SyntaxError,或出现数字而不是字符串)?
- 2024-11-18 08:41:00
- admin 原创
- 21
问题描述:
当我尝试运行这个简单的脚本时出现错误:
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
我正在运行 Mac OS X 10.9.1,并使用安装 Python 3.3 时附带的 Python Launcher 应用程序来运行该脚本。
尽管原始问题专门询问的是 a NameError
,但同样的问题也是SyntaxError
由于尝试输入(例如,空白行或任何不能理解为 Python 表达式的内容)而导致 s 的原因。
此问题通常是因为无意中使用了 2.x 版本的 Python来运行代码而发生的。请参阅如何检查哪个版本的 Python 正在运行我的脚本?以获取帮助。
解决方案 1:
总结
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
。
解决方案 2:
您正在使用 Python 2,而不是 Python 3。为了在 Python 2 中运行,请使用raw_input
。
input_variable = raw_input ("Enter your name: ")
print ("your name is" + input_variable)
解决方案 3:
由于您正在为 Python 3.x 编写脚本,因此您需要以以下命令开始您的脚本:
#!/usr/bin/env python3
如果您使用:
#!/usr/bin/env python
它将默认使用 Python 2.x。如果没有以#!开头的内容(又称 shebang),则这些将出现在脚本的第一行。
如果你的脚本只是以以下内容开头:
#! python
然后你可以将其更改为:
#! python3
虽然这种较短的格式只有启动器等少数程序可以识别,所以它并不是最好的选择。
前两个示例用途更为广泛,可帮助确保您的代码可以在任何安装了 Python 的机器上运行。
解决方案 4:
我也遇到了这个问题,这个模块应该与 Python 2.7 和 3.7 兼容
我发现修复该问题的方法是导入:
from six.moves import input
这修复了两个解释器的可用性
您可以在此处阅读有关六个库的更多信息
解决方案 5:
您应该使用,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))
解决方案 6:
如果您只是想读取字符串,请尝试使用raw_input
而不是。input
print("Enter your name: ")
x = raw_input()
print("Hello, "+x)
解决方案 7:
input_variable = input ("Enter your name: ")
print ("your name is" + input_variable)
您必须在单引号或双引号中输入
Ex:'dude' -> correct
dude -> not correct
解决方案 8:
对于 Python 3 及以上版本
s = raw_input()
它将解决 pycharm IDE 上的问题,如果您正在在线网站上解决 hackerrank,那么使用:
s = input()
解决方案 9:
我们使用以下适用于Python 2 和 Python 3 的方法
#Works in Python 2 and 3:
try: input = raw_input
except NameError: pass
print(input("Enter your name: "))
解决方案 10:
有两种方法可以解决这些问题,
第一种方法很简单,无需更改代码,只需
使用 Python3 运行脚本即可。
如果您仍想在 python2 上运行,则在运行 python 脚本后,输入时请记住
1. 如果你想输入`string`,那么只需开始输入“输入带双引号”,它将在 python2.7 中工作,并且
2. 如果你想输入字符,那么使用带单引号的输入,如“你的输入在这里”
3. 如果你想输入数字,这不是问题,你只需输入数字
第二种方法是更改代码,
使用下面的导入并使用任何版本的 Python 运行
1. `from six.moves import input`
2. 在代码中使用任何导入函数`raw_input()`而不是函数`input()`
3. `str()`使用类似函数清理代码`str(input())`然后分配给任何变量
正如错误所暗示的:
名称“dude”未定义,即对于python“dude”在这里成为变量,并且它没有分配任何python定义类型的值,
所以它只会像婴儿一样哭泣,所以如果我们定义一个“dude”变量并分配任何值并传递给它,它会工作,但这不是我们想要的,因为我们不知道用户会输入什么,而且我们想捕获用户输入。
关于这些方法的事实:
input()
函数:此函数按原样获取您输入的值和类型,而不修改其类型。
raw_input()
函数:此函数明确将您提供的输入转换为字符串类型,注意:
input() 方法中的漏洞在于,任何人只需使用变量或方法的名称就可以访问访问输入值的变量。
解决方案 11:
你可以这样做:
x = raw_input("enter your name")
print "your name is %s " % x
或者:
x = str(input("enter your name"))
print "your name is %s" % x
解决方案 12:
对于可能遇到此问题的其他任何人来说,即使你#!/usr/bin/env python3
在脚本的开头包含该文件,如果该文件不可执行,shebang 也会被忽略。
要确定您的文件是否可执行:
./filename.py
从命令行运行如果得到
-bash: ./filename.py: Permission denied
,运行chmod a+x filename.py
./filename.py
再次运行
如果你按照 Kevin 的建议添加了import sys; print(sys.version)
,你现在会看到该脚本正在由 python3 解释
解决方案 13:
以前的贡献很好。
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
('嗨','乔',<type'str'>)
嗨,乔,再见
你的名字:乔
乔
谢谢!
解决方案 14:
你可以更改你正在使用 IDE 的 Python,如果你已经下载了 Python 3.x,那么切换应该不太难。但是你的脚本在 Python 3.x 上运行良好,我只需更改
print ("your name is" + input_variable)
到
print ("your name is", input_variable)
因为使用逗号时,它会在逗号your name is
和用户输入的内容之间打印一个空格。并且:如果您使用的是 2.7,则只需使用它raw_input
而不是输入。
解决方案 15:
这是一个与 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)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件