Python小白历险记(1)关于碰到的NameError: name 'xxx' is not defined 错的折腾
在web前端,张小白的学习中,已经遇到了vscode的编码害死人的问题了。没想到在学习《AI全栈成长计划-AI基础篇》的Python语言时,又来了一次。下面把经过跟大家汇报一下。
话说教程中1.3节《基本语句》的讲解中有一个基本break和continue的语句:
张小白原来没想到会有什么难度,就简单地在Vscode的python命令行界面进行尝试:
哪里知道,敲命令行也会老犯低级错误,比如False写成false, else后面忘记加冒号等等。张小白想想似乎不大好,干脆在Vscode写个py文件好了。于是入坑。。。
一开始的写法是这样的:
报了个 NameError: name 'ZhangHui' is not defined 错。
感觉可能是input语句写错了,查了下资料,input貌似写成单引号或者双引号都是对的。
不死心的张小白又用了单引号试了下,也是一样的错。
userlist = ['Zhanghui','Huawei','IoT'] bvalid = False count = 3 while count > 0: userInput = input('Enter your name here:') print(userInput) for user in userlist: if user == userInput: bvalid = True break if not bvalid: print('You name does not exist in my system.Try again!') count -=1 continue else: print('Welcome,',userInput) break else: print('You have tried 3 times!')
原文看起来好像也没啥问题。。
甚至,张小白把其他语句都去掉了,留下了光秃秃的input。。。
还是老样子。。
甚至去掉提示符:
真是顽固的python。。。
我把问题发到群里,大虾们纷纷帮我出主意。。。
有位大大说,可能是空格不是半角空格的问题,for user in userList这样的里面的空格不是半角空格
另一位大大说:
看来果然是跟Web前端编码类似的问题,先用pycharm试一下吧:
在pycharm新建个工程,将代码拷贝过来:
果然发现,有四个粉红色的地方,应该是空格有问题。。不知道是不是又变成了“不间断空格”。待会儿再试。。。
先将这些错误改正:
果然,可以正常出结果了。(当然了,读者可能还没发现,其实这个执行的逻辑是不对的。这个稍后再说。。。)
我们再用pycharm中运行错误的代码,拷贝回vscode。
再运行:
userlist=['Zhanghui','Huawei','IoT'] bvalid=False count=3 while count>0: userInput=input('Enter your name here:') print(userInput) for user in userlist: if user == userInput: bvalid=True break if not bvalid: print('You name does not exist in my system.Try again!') count-=1 continue else: print('Welcome,',userInput) break else: print('You have tried 3 times!')
唉,又报了另一个错:SyntaxError: Non-ASCII character '\xc2' in file continue.py on line 5, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
看来还是非法字符的问题,张小白查了下资料,将 最前面加了个注释:# -*- coding:UTF-8 -*-
终于vscode 告诉我,这里空格有问题。好像是个中文乱码。。。有点像繁体字的“听”。。。
果然又是C2 A0的不间断空格的坑。。。
一个一个地去排坑,原来引号内的也是有问题的。。。
依次删除各类空格。。。继续运行。。。
结果还是有NameError: name 'xxx' is not defined的错。去掉了不间断空格的问题,在 Vscode上,问题又跑了回来。难道 张小白,你不是忘了初心,而是忘了出发?(王建国的话在张小白耳边嗡嗡作响。。。)
笔者有点奇怪,为啥PyCharm可以,但是VScode不行。除了vscode的不可见空格之外,还有什么在难为张小白呢?
咦?怎么vscode用的python是2.7? Pycharm用的版本是3.7?
原来是vscode读环境变量惹的祸。张小白的电脑上同时装了2个版本的python,但是vscode指向了2.7.。难道2.7没有某些特性吗?
去将环境变量中两个python2.7的path删除:
留下miniconda3的python3.7。。。
重新打开vscode终端,检查下python的版本:终于是3.7了。。。
然后再跑一下:
终于可以跑出来结果了。
原来python2可能不支持input或者其他别的语句吧。。。这个以后再研究。。。
张小白觉得这个流程很不爽,输入一次,弹出3个错误。。完全应该是输入三次,三次都失败则没了,否则应该重新输入而已。。。
改BUG:
显然原来上面两个判断的位置不对,应该前移一个缩进。。。否则就是放在for循环里面进行判断了。。。
看来python虽然写起来很简单,但是它完全依靠缩进和冒号来进行代码的分布。。。貌似少了很多像C语言或者Java语言的括号,导致匹配很容易出现问题。。。
这样的话,写python语句真的要非常小心了。。python貌似没那么AI。。(它居然还老是用在AI上。。。)
(全文完,谢谢阅读,另外感谢群里各位大大的帮助: @0o0 @行羽 @云水不言 @ROC @笨笨 @city hunter )
- 点赞
- 收藏
- 关注作者
评论(0)