Python input函数在Terminal运行报错求助:字符串输入触发NameError
搞定这个
input()报错的问题! 嘿,看你的错误信息NameError: name 'complete' is not defined,我一眼就看出问题出在哪了——你用的是Python 2的解释器,但写的是Python 3的代码!
为啥会出这问题?
你Terminal里调用的/usr/bin/pythonw是系统默认的Python 2解释器,这俩版本的input()函数差别可大了:
- Python 2里的
input()会把你输入的内容当成Python代码执行,你输入complete,它就去找叫complete的变量,找不到就报错。 - 而你输入数字的程序能跑,是因为输入数字时,Python 2的
input()直接把它转成整数了,刚好契合你的代码逻辑。 - 但Python 3里的
input()才是直接读字符串,这也是你本来想要的效果。
先帮你把代码格式理清楚(你原来的代码连换行都没,难怪看着费劲):
prompt = "\nTell me something, and I will repeat it back to you:" prompt += "\nEnter 'complete' to end the program. " message = "" while message != 'complete': message = input(prompt) print(message)
这套代码在Python 3里跑完全没问题,但在Python 2里必须把input()换成raw_input()才行。
给你两个解决方案,选哪个都行:
直接用Python 3运行代码:
在Terminal里把命令里的pythonw换成python3就行,比如:cd '/Users/linyang/Desktop/python_work/' && python3 '/Users/linyang/Desktop/python_work/parrot.py'要是想在Sublime Text里直接跑,就把它的默认解释器改成Python 3,以后就不用每次去Terminal折腾了。
写兼容两个版本的代码:
要是你需要代码在Python 2和3里都能跑,就在代码最开头加一段兼容代码:try: input = raw_input except NameError: pass prompt = "\nTell me something, and I will repeat it back to you:" prompt += "\nEnter 'complete' to end the program. " message = "" while message != 'complete': message = input(prompt) print(message)这段代码的作用是:在Python 2里把
input()替换成raw_input(),Python 3里啥也不做,完美兼容。
再说说你的数字程序为啥能跑
你的数字输入程序在Python 2里能运行,其实是个巧合:输入6时,Python 2的input()直接返回整数6,你后面又做了一次int(number)转换,虽然多此一举,但没报错。要是你输入个非数字的内容,比如abc,同样会报错。换成Python 3的话,input()返回字符串,int(number)的转换才是必须的步骤。
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

