为什么在使用输入函数(在 Python 2.x 中)时会出现“NameError:名称‘...’未定义”(或 SyntaxError,或出现数字而不是字符串)?

2024-11-18 08:41:00
admin
原创
210
摘要:问题描述:当我尝试运行这个简单的脚本时出现错误:input_variable = input("Enter your name: ") print("your name is" + input_variable) 假设我输入“dude”,我收到的错误是: line 1...

问题描述:

当我尝试运行这个简单的脚本时出现错误:

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:

总结

inputPython 2.7 中的函数会将您输入的任何内容作为 Python 表达式进行求值。如果您只是想读取字符串,那么请使用raw_inputPython 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)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用