Python小白历险记(1)关于碰到的NameError: name 'xxx' is not defined 错的折腾

举报
张辉 发表于 2020/09/18 12:27:21 2020/09/18
【摘要】 Python初学者张小白又在兴风作浪。。。。

在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 )

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。