input() error - NameError: name '没有定义

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

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应用程序来运行脚本。

884412 次浏览

您正在运行Python 2,而不是Python 3。为了在python2中工作,使用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, 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的安全注意事项:

因为无论评估的是哪种用户类型,都会带来安全问题。例如,如果你已经用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函数调用,因此它也会被调用。这就是为什么我们再次看到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的机器上运行。

对于任何可能遇到这个问题的人来说,事实证明,即使你在脚本的开头包含#!/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解释

如果你已经下载了python3,你可以改变你在IDE中使用的python。X,转换起来应该不难。但是你的脚本在python3上运行良好。x,我只需要改变

print ("your name is" + input_variable)

print ("your name is", input_variable)

因为使用逗号时,它会在your name is和用户输入的任何内容之间打印一个空格。AND:如果你使用2.7,只需使用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-2.7。当你在一个变量(例如:s = input('Name: '))上使用input()时,它将在Python环境上执行命令,而不保存你在变量(s)上所写的内容,如果你所写的内容没有定义,则会创建一个错误。

raw_input()将正确地保存你写在变量上的内容(例如:f = raw_input('Name : ')),并且它不会在Python环境中执行它而不会产生任何可能的错误:

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

这修复了两个解释器的可用性

你可以阅读更多关于六个库在这里

解决这些问题有两种方法,

  • 1是简单的,没有代码更改,即
    通过Python3运行脚本, < br > 如果你仍然想在python2上运行然后 运行python脚本后,当您输入输入时请记住

    1. 如果你想输入string,那么只需开始输入“input goes with double quote”,它将在python2.7和
    2. 如果你想输入字符那就用单引号输入比如" your input goes here "
    3. 如果你想输入数字不是一个问题,你只需输入数字
    4. 李< / ol > < / >
    5. 第二种方式是代码更改
      使用下面的导入并在任何版本的python

      上运行
      1. from six.moves import input
      2. 在任何导入的代码中使用raw_input()函数而不是input()函数
      3. 使用str()函数(如str(input()))来清理代码,然后赋值给任何变量
      4. 李< / ol > < / >

正如错误暗示的那样:
name 'dude'未定义 例如,对于python来说,'dude'在这里成为变量,它没有任何python定义的type assigned
的值,所以它只会像婴儿一样哭泣,所以如果我们定义一个'dude'变量,并分配任何值并传递给它,它会工作,但这不是我们想要的,因为我们不知道用户将输入什么,而且我们想要捕获用户输入

< p > 关于这些方法的事实: < br > input()函数:这个函数接受你输入的值和类型,不修改它的类型。< br > raw_input() 这个函数显式地将输入转换为string类型,

注意:
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)